gamefic 0.6.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/bin/gamefic +3 -0
 - data/lib/gamefic/character.rb +42 -6
 - data/lib/gamefic/director/parser.rb +25 -25
 - data/lib/gamefic/engine/tty.rb +14 -2
 - data/lib/gamefic/engine.rb +8 -7
 - data/lib/gamefic/grammar/gender.rb +1 -1
 - data/lib/gamefic/grammar/pronouns.rb +53 -8
 - data/lib/gamefic/grammar/verbs.rb +1 -0
 - data/lib/gamefic/grammar/word_adapter.rb +31 -18
 - data/lib/gamefic/html.rb +27 -13
 - data/lib/gamefic/plot/article_mount.rb +1 -1
 - data/lib/gamefic/plot/scene_mount.rb +27 -110
 - data/lib/gamefic/{snapshots.rb → plot/snapshot.rb} +60 -29
 - data/lib/gamefic/plot/you_mount.rb +1 -1
 - data/lib/gamefic/plot.rb +56 -29
 - data/lib/gamefic/query/base.rb +3 -1
 - data/lib/gamefic/scene/active.rb +11 -18
 - data/lib/gamefic/scene/base.rb +21 -0
 - data/lib/gamefic/scene/conclusion.rb +11 -0
 - data/lib/gamefic/scene/custom.rb +21 -0
 - data/lib/gamefic/scene/multiple_choice/input.rb +11 -0
 - data/lib/gamefic/scene/multiple_choice.rb +73 -0
 - data/lib/gamefic/scene/passive.rb +17 -0
 - data/lib/gamefic/scene/pause.rb +24 -0
 - data/lib/gamefic/scene/question.rb +21 -0
 - data/lib/gamefic/scene/yes_or_no.rb +30 -0
 - data/lib/gamefic/scene.rb +10 -120
 - data/lib/gamefic/script/base.rb +7 -2
 - data/lib/gamefic/script.rb +4 -0
 - data/lib/gamefic/shell/command/base.rb +38 -0
 - data/lib/gamefic/shell/command/play.rb +51 -0
 - data/lib/gamefic/shell/command.rb +4 -0
 - data/lib/gamefic/shell/registry.rb +13 -0
 - data/lib/gamefic/shell.rb +14 -71
 - data/lib/gamefic/source/file.rb +1 -1
 - data/lib/gamefic/source.rb +5 -0
 - data/lib/gamefic/tester.rb +0 -1
 - data/lib/gamefic/version.rb +1 -1
 - data/lib/gamefic.rb +1 -6
 - metadata +69 -61
 - data/lib/gamefic/scene/concluded.rb +0 -22
 - data/lib/gamefic/scene/multiplechoice.rb +0 -74
 - data/lib/gamefic/scene/paused.rb +0 -26
 - data/lib/gamefic/scene/yesorno.rb +0 -43
 
| 
         @@ -0,0 +1,73 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Gamefic
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              # Provide a list of options and process the selection in the scene's finish
         
     | 
| 
      
 4 
     | 
    
         
            +
              # block. After the scene is finished, the :active scene will be cued unless
         
     | 
| 
      
 5 
     | 
    
         
            +
              # some other scene has already been prepared or cued.
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              # The finish block's input parameter receives a MultipleChoice::Input object
         
     | 
| 
      
 8 
     | 
    
         
            +
              # instead of a String.
         
     | 
| 
      
 9 
     | 
    
         
            +
              #
         
     | 
| 
      
 10 
     | 
    
         
            +
              class Scene::MultipleChoice < Scene::Custom
         
     | 
| 
      
 11 
     | 
    
         
            +
                autoload :Input, 'gamefic/scene/multiple_choice/input'
         
     | 
| 
      
 12 
     | 
    
         
            +
                
         
     | 
| 
      
 13 
     | 
    
         
            +
                def initialize config = {}
         
     | 
| 
      
 14 
     | 
    
         
            +
                  super
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @options = (config[:options] || [])
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @invalid_choice_message = config[:invalid_choice_message]
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
                
         
     | 
| 
      
 19 
     | 
    
         
            +
                def start actor
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @current_options = @options.clone
         
     | 
| 
      
 21 
     | 
    
         
            +
                  @start.call(actor, @current_options) unless @start.nil?
         
     | 
| 
      
 22 
     | 
    
         
            +
                  tell_choices actor
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
                
         
     | 
| 
      
 25 
     | 
    
         
            +
                def finish actor, input
         
     | 
| 
      
 26 
     | 
    
         
            +
                  this_scene = actor.scene
         
     | 
| 
      
 27 
     | 
    
         
            +
                  index = nil
         
     | 
| 
      
 28 
     | 
    
         
            +
                  choice = nil
         
     | 
| 
      
 29 
     | 
    
         
            +
                  if input.strip =~ /[0-9]+/ and input.to_i > 0
         
     | 
| 
      
 30 
     | 
    
         
            +
                    index = input.to_i - 1
         
     | 
| 
      
 31 
     | 
    
         
            +
                    choice = @current_options[index]
         
     | 
| 
      
 32 
     | 
    
         
            +
                  else
         
     | 
| 
      
 33 
     | 
    
         
            +
                    index = 0
         
     | 
| 
      
 34 
     | 
    
         
            +
                    @current_options.each { |o|
         
     | 
| 
      
 35 
     | 
    
         
            +
                      if o.casecmp(input).zero?
         
     | 
| 
      
 36 
     | 
    
         
            +
                        choice = o
         
     | 
| 
      
 37 
     | 
    
         
            +
                        break
         
     | 
| 
      
 38 
     | 
    
         
            +
                      end
         
     | 
| 
      
 39 
     | 
    
         
            +
                      index += 1
         
     | 
| 
      
 40 
     | 
    
         
            +
                    }
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  if choice.nil?
         
     | 
| 
      
 43 
     | 
    
         
            +
                    actor.tell invalid_choice_message
         
     | 
| 
      
 44 
     | 
    
         
            +
                    tell_choices actor
         
     | 
| 
      
 45 
     | 
    
         
            +
                  else
         
     | 
| 
      
 46 
     | 
    
         
            +
                    input_object = Input.new(input, index, choice)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    super actor, input_object
         
     | 
| 
      
 48 
     | 
    
         
            +
                    actor.cue :active if (actor.scene == this_scene and actor.next_scene.nil?)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                def prompt
         
     | 
| 
      
 53 
     | 
    
         
            +
                  @prompt ||= "Enter a choice:"
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
                
         
     | 
| 
      
 56 
     | 
    
         
            +
                def invalid_choice_message
         
     | 
| 
      
 57 
     | 
    
         
            +
                  @invalid_choice_message ||= "That's not a valid selection."
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
                
         
     | 
| 
      
 60 
     | 
    
         
            +
                private
         
     | 
| 
      
 61 
     | 
    
         
            +
                
         
     | 
| 
      
 62 
     | 
    
         
            +
                def tell_choices actor
         
     | 
| 
      
 63 
     | 
    
         
            +
                  list = '<ol class="multiple_choice">'
         
     | 
| 
      
 64 
     | 
    
         
            +
                  @current_options.each { |o|
         
     | 
| 
      
 65 
     | 
    
         
            +
                    list += "<li>#{o}</li>"
         
     | 
| 
      
 66 
     | 
    
         
            +
                  }
         
     | 
| 
      
 67 
     | 
    
         
            +
                  list += "</ol>"
         
     | 
| 
      
 68 
     | 
    
         
            +
                  actor.tell list
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
                
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Gamefic
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              # Passive Scenes immediately cue another scene after they're finished. If no
         
     | 
| 
      
 4 
     | 
    
         
            +
              # scene has been cued or prepared, it defaults to the :active scene.
         
     | 
| 
      
 5 
     | 
    
         
            +
              #
         
     | 
| 
      
 6 
     | 
    
         
            +
              class Scene::Passive < Scene::Custom
         
     | 
| 
      
 7 
     | 
    
         
            +
                def initialize &block
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @start = block
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
                def start actor
         
     | 
| 
      
 11 
     | 
    
         
            +
                  this_scene = actor.scene
         
     | 
| 
      
 12 
     | 
    
         
            +
                  super
         
     | 
| 
      
 13 
     | 
    
         
            +
                  actor.cue :active if (actor.scene == this_scene and actor.next_scene.nil?)     
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
                
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Gamefic
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              # Wait for input. After the scene is finished (e.g., the player presses
         
     | 
| 
      
 4 
     | 
    
         
            +
              # Enter), the :active scene will be cued if no other scene has been prepared
         
     | 
| 
      
 5 
     | 
    
         
            +
              # or cued.
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              class Scene::Pause < Scene::Custom
         
     | 
| 
      
 8 
     | 
    
         
            +
                def initialize prompt = nil, &block
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @prompt = prompt
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @start = block
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
                def start actor
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @start_scene = actor.scene
         
     | 
| 
      
 14 
     | 
    
         
            +
                  super
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
                def finish actor, input
         
     | 
| 
      
 17 
     | 
    
         
            +
                  actor.cue :active if (actor.scene == @start_scene and actor.next_scene.nil?)
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
                def prompt
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @prompt ||= "Press Enter to continue..."
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
              
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Gamefic
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              # Question Scenes handle a string of arbitrary input. Examples include
         
     | 
| 
      
 4 
     | 
    
         
            +
              # asking for a password, a destination, or a topic of conversation. The
         
     | 
| 
      
 5 
     | 
    
         
            +
              # finish block is solely responsible for processing the answer.
         
     | 
| 
      
 6 
     | 
    
         
            +
              # After the scene is finished, the :active scene will automatically be cued
         
     | 
| 
      
 7 
     | 
    
         
            +
              # if no other scene has been cued or prepared.
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              class Scene::Question < Scene::Custom
         
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize prompt, &block
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @prompt = prompt
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @finish = block
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
                def finish actor, input
         
     | 
| 
      
 15 
     | 
    
         
            +
                  this_scene = actor.scene
         
     | 
| 
      
 16 
     | 
    
         
            +
                  super
         
     | 
| 
      
 17 
     | 
    
         
            +
                  actor.cue :active if (actor.scene == this_scene and actor.next_scene.nil?)
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Gamefic
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              # Prompt the user to answer "yes" or "no". The scene will accept variations
         
     | 
| 
      
 4 
     | 
    
         
            +
              # like "YES" or "n" and normalize the answer to "yes" or "no" in the finish
         
     | 
| 
      
 5 
     | 
    
         
            +
              # block. After the scene is finished, the :active scene will be cued if no
         
     | 
| 
      
 6 
     | 
    
         
            +
              # other scene has been prepared or cued.
         
     | 
| 
      
 7 
     | 
    
         
            +
              #
         
     | 
| 
      
 8 
     | 
    
         
            +
              class Scene::YesOrNo < Scene::Custom
         
     | 
| 
      
 9 
     | 
    
         
            +
                def initialize prompt = nil, &block
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @prompt = prompt
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @finish = block
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
                def finish actor, input
         
     | 
| 
      
 14 
     | 
    
         
            +
                  answer = nil
         
     | 
| 
      
 15 
     | 
    
         
            +
                  if input.downcase[0, 1] == "y"
         
     | 
| 
      
 16 
     | 
    
         
            +
                    answer = "yes"
         
     | 
| 
      
 17 
     | 
    
         
            +
                  elsif input.downcase[0, 1] == "n"
         
     | 
| 
      
 18 
     | 
    
         
            +
                    answer = "no"
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  if answer.nil?
         
     | 
| 
      
 21 
     | 
    
         
            +
                    actor.tell "Please enter Yes or No."
         
     | 
| 
      
 22 
     | 
    
         
            +
                  else
         
     | 
| 
      
 23 
     | 
    
         
            +
                    this_scene = actor.scene
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @finish.call actor, answer
         
     | 
| 
      
 25 
     | 
    
         
            +
                    actor.cue :active if (actor.scene == this_scene and actor.next_scene.nil?)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/gamefic/scene.rb
    CHANGED
    
    | 
         @@ -1,125 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Gamefic
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
               
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
              #       actor[:name] = data.input
         
     | 
| 
       14 
     | 
    
         
            -
              #       actor.tell "Howdy, #{actor[:name]}!"
         
     | 
| 
       15 
     | 
    
         
            -
              #       data.next_cue = :active # Proceed to the default :active scene
         
     | 
| 
       16 
     | 
    
         
            -
              #     end
         
     | 
| 
       17 
     | 
    
         
            -
              #   end
         
     | 
| 
       18 
     | 
    
         
            -
              #
         
     | 
| 
       19 
     | 
    
         
            -
              class SceneManager
         
     | 
| 
       20 
     | 
    
         
            -
                attr_accessor :state
         
     | 
| 
       21 
     | 
    
         
            -
                attr_writer :prompt
         
     | 
| 
       22 
     | 
    
         
            -
                
         
     | 
| 
       23 
     | 
    
         
            -
                def initialize &block
         
     | 
| 
       24 
     | 
    
         
            -
                  yield self if block_given?
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
                
         
     | 
| 
       27 
     | 
    
         
            -
                # Get the SceneData class that provide data about the current event to a
         
     | 
| 
       28 
     | 
    
         
            -
                # Scene instance.
         
     | 
| 
       29 
     | 
    
         
            -
                #
         
     | 
| 
       30 
     | 
    
         
            -
                def data_class
         
     | 
| 
       31 
     | 
    
         
            -
                  SceneData
         
     | 
| 
       32 
     | 
    
         
            -
                end
         
     | 
| 
       33 
     | 
    
         
            -
                
         
     | 
| 
       34 
     | 
    
         
            -
                # Get the name that describes this scene's state.
         
     | 
| 
       35 
     | 
    
         
            -
                # Two common values for the state are Active and Passive. If a scene is
         
     | 
| 
       36 
     | 
    
         
            -
                # Active, it is capable of accepting user input. If it is Passive, it
         
     | 
| 
       37 
     | 
    
         
            -
                # is probably not interactive (e.g., a cutscene) and will usually cue
         
     | 
| 
       38 
     | 
    
         
            -
                # an Active scene in order to continue gameplay.
         
     | 
| 
       39 
     | 
    
         
            -
                #
         
     | 
| 
       40 
     | 
    
         
            -
                # @return [String] The name of the state.
         
     | 
| 
       41 
     | 
    
         
            -
                def state
         
     | 
| 
       42 
     | 
    
         
            -
                  @state ||= 'Passive'
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
                
         
     | 
| 
       45 
     | 
    
         
            -
                # Get the Scene class that the SceneManager uses to prepare a scene for
         
     | 
| 
       46 
     | 
    
         
            -
                # the plot.
         
     | 
| 
       47 
     | 
    
         
            -
                #
         
     | 
| 
       48 
     | 
    
         
            -
                def scene_class
         
     | 
| 
       49 
     | 
    
         
            -
                  Scene
         
     | 
| 
       50 
     | 
    
         
            -
                end
         
     | 
| 
       51 
     | 
    
         
            -
                
         
     | 
| 
       52 
     | 
    
         
            -
                # Define a Block to be executed when the scene starts. The Engine should
         
     | 
| 
       53 
     | 
    
         
            -
                # execute this block before the player is queried for input.
         
     | 
| 
       54 
     | 
    
         
            -
                #
         
     | 
| 
       55 
     | 
    
         
            -
                # @yieldparam [Character]
         
     | 
| 
       56 
     | 
    
         
            -
                # @yieldparam [SceneData]
         
     | 
| 
       57 
     | 
    
         
            -
                def start &block
         
     | 
| 
       58 
     | 
    
         
            -
                  @start = block
         
     | 
| 
       59 
     | 
    
         
            -
                end
         
     | 
| 
       60 
     | 
    
         
            -
                
         
     | 
| 
       61 
     | 
    
         
            -
                # Define a Block to be executed when the scene finishes. The engine should
         
     | 
| 
       62 
     | 
    
         
            -
                # process user input in this block.
         
     | 
| 
       63 
     | 
    
         
            -
                #
         
     | 
| 
       64 
     | 
    
         
            -
                # @yieldparam [Character]
         
     | 
| 
       65 
     | 
    
         
            -
                # @yieldparam [SceneData]
         
     | 
| 
       66 
     | 
    
         
            -
                def finish &block
         
     | 
| 
       67 
     | 
    
         
            -
                  @finish = block
         
     | 
| 
       68 
     | 
    
         
            -
                end
         
     | 
| 
       69 
     | 
    
         
            -
                
         
     | 
| 
       70 
     | 
    
         
            -
                # Prepare a new Scene for execution.
         
     | 
| 
       71 
     | 
    
         
            -
                #
         
     | 
| 
       72 
     | 
    
         
            -
                # @return [Scene]
         
     | 
| 
       73 
     | 
    
         
            -
                def prepare key
         
     | 
| 
       74 
     | 
    
         
            -
                  scene_class.new(self, key)
         
     | 
| 
       75 
     | 
    
         
            -
                end
         
     | 
| 
       76 
     | 
    
         
            -
                
         
     | 
| 
       77 
     | 
    
         
            -
                # Get the prompt to display to the user when requesting input.
         
     | 
| 
       78 
     | 
    
         
            -
                #
         
     | 
| 
       79 
     | 
    
         
            -
                # @return [String]
         
     | 
| 
       80 
     | 
    
         
            -
                def prompt
         
     | 
| 
       81 
     | 
    
         
            -
                  @prompt ||= ">"
         
     | 
| 
       82 
     | 
    
         
            -
                end
         
     | 
| 
       83 
     | 
    
         
            -
            end
         
     | 
| 
       84 
     | 
    
         
            -
              
         
     | 
| 
       85 
     | 
    
         
            -
              class SceneData
         
     | 
| 
       86 
     | 
    
         
            -
                attr_accessor :input, :prompt, :next_cue
         
     | 
| 
      
 3 
     | 
    
         
            +
              module Scene
         
     | 
| 
      
 4 
     | 
    
         
            +
                autoload :Base, 'gamefic/scene/base'
         
     | 
| 
      
 5 
     | 
    
         
            +
                autoload :Custom, 'gamefic/scene/custom'
         
     | 
| 
      
 6 
     | 
    
         
            +
                autoload :Active, 'gamefic/scene/active'
         
     | 
| 
      
 7 
     | 
    
         
            +
                autoload :Passive, 'gamefic/scene/passive'
         
     | 
| 
      
 8 
     | 
    
         
            +
                autoload :Pause, 'gamefic/scene/pause'
         
     | 
| 
      
 9 
     | 
    
         
            +
                autoload :Conclusion, 'gamefic/scene/conclusion'
         
     | 
| 
      
 10 
     | 
    
         
            +
                autoload :MultipleChoice, 'gamefic/scene/multiple_choice'
         
     | 
| 
      
 11 
     | 
    
         
            +
                autoload :YesOrNo, 'gamefic/scene/yes_or_no'
         
     | 
| 
      
 12 
     | 
    
         
            +
                autoload :Question, 'gamefic/scene/question'
         
     | 
| 
       87 
13 
     | 
    
         
             
              end
         
     | 
| 
       88 
14 
     | 
    
         | 
| 
       89 
     | 
    
         
            -
              class Scene
         
     | 
| 
       90 
     | 
    
         
            -
                attr_reader :data, :state, :key
         
     | 
| 
       91 
     | 
    
         
            -
                
         
     | 
| 
       92 
     | 
    
         
            -
                def initialize(manager, key)
         
     | 
| 
       93 
     | 
    
         
            -
                  @manager = manager
         
     | 
| 
       94 
     | 
    
         
            -
                  @start = manager.instance_variable_get(:@start)
         
     | 
| 
       95 
     | 
    
         
            -
                  @finish = manager.instance_variable_get(:@finish)
         
     | 
| 
       96 
     | 
    
         
            -
                  @state = manager.state
         
     | 
| 
       97 
     | 
    
         
            -
                  @data = manager.data_class.new
         
     | 
| 
       98 
     | 
    
         
            -
                  @data.prompt = manager.prompt
         
     | 
| 
       99 
     | 
    
         
            -
                  @key = key
         
     | 
| 
       100 
     | 
    
         
            -
                end
         
     | 
| 
       101 
     | 
    
         
            -
                
         
     | 
| 
       102 
     | 
    
         
            -
                # Start the scene. This method is typically called by the Plot.
         
     | 
| 
       103 
     | 
    
         
            -
                #
         
     | 
| 
       104 
     | 
    
         
            -
                # @param actor [Character] The Scene's Character.
         
     | 
| 
       105 
     | 
    
         
            -
                def start actor
         
     | 
| 
       106 
     | 
    
         
            -
                  return if @start.nil?
         
     | 
| 
       107 
     | 
    
         
            -
                  @data.input = nil
         
     | 
| 
       108 
     | 
    
         
            -
                  @start.call actor, @data
         
     | 
| 
       109 
     | 
    
         
            -
                end
         
     | 
| 
       110 
     | 
    
         
            -
                
         
     | 
| 
       111 
     | 
    
         
            -
                # Finish the scene. This method is typically called by the Plot.
         
     | 
| 
       112 
     | 
    
         
            -
                # The Finish method is responsible for processing any input received
         
     | 
| 
       113 
     | 
    
         
            -
                # from players.
         
     | 
| 
       114 
     | 
    
         
            -
                #
         
     | 
| 
       115 
     | 
    
         
            -
                # @param actor [Character] The Scene's Character.
         
     | 
| 
       116 
     | 
    
         
            -
                # @param input [String] Input received from the Character (e.g., a player command).
         
     | 
| 
       117 
     | 
    
         
            -
                def finish actor, input
         
     | 
| 
       118 
     | 
    
         
            -
                  @data.next_cue ||= :active
         
     | 
| 
       119 
     | 
    
         
            -
                  return if @finish.nil?
         
     | 
| 
       120 
     | 
    
         
            -
                  @data.input = input
         
     | 
| 
       121 
     | 
    
         
            -
                  @finish.call actor, @data
         
     | 
| 
       122 
     | 
    
         
            -
                end
         
     | 
| 
       123 
     | 
    
         
            -
              end
         
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
15 
     | 
    
         
             
            end
         
     | 
    
        data/lib/gamefic/script/base.rb
    CHANGED
    
    | 
         @@ -11,18 +11,23 @@ module Gamefic 
     | 
|
| 
       11 
11 
     | 
    
         
             
                def read
         
     | 
| 
       12 
12 
     | 
    
         
             
                  raise "#read must be defined in subclasses"
         
     | 
| 
       13 
13 
     | 
    
         
             
                end
         
     | 
| 
       14 
     | 
    
         
            -
                # Get the script's path
         
     | 
| 
      
 14 
     | 
    
         
            +
                # Get the script's path.
         
     | 
| 
       15 
15 
     | 
    
         
             
                #
         
     | 
| 
       16 
16 
     | 
    
         
             
                # @return [String]
         
     | 
| 
       17 
17 
     | 
    
         
             
                def path
         
     | 
| 
       18 
18 
     | 
    
         
             
                  raise "#path must be defined in subclasses"
         
     | 
| 
       19 
19 
     | 
    
         
             
                end
         
     | 
| 
       20 
     | 
    
         
            -
                # Get the absolute path of the script's original file
         
     | 
| 
      
 20 
     | 
    
         
            +
                # Get the absolute path of the script's original file, or its URL for
         
     | 
| 
      
 21 
     | 
    
         
            +
                # sources that are not file-based.
         
     | 
| 
       21 
22 
     | 
    
         
             
                #
         
     | 
| 
       22 
23 
     | 
    
         
             
                # @return [String]
         
     | 
| 
       23 
24 
     | 
    
         
             
                def absolute_path
         
     | 
| 
       24 
25 
     | 
    
         
             
                  raise "#absolute_path must be defined in subclasses"
         
     | 
| 
       25 
26 
     | 
    
         
             
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
                # Script objects are equal if their relative paths are the same. Note that
         
     | 
| 
      
 28 
     | 
    
         
            +
                # they are still considered equal if their absolute paths are different,
         
     | 
| 
      
 29 
     | 
    
         
            +
                # or even if they come from different types of sources.
         
     | 
| 
      
 30 
     | 
    
         
            +
                #
         
     | 
| 
       26 
31 
     | 
    
         
             
                # @param other[Script::Base]
         
     | 
| 
       27 
32 
     | 
    
         
             
                # @return [Boolean]
         
     | 
| 
       28 
33 
     | 
    
         
             
                def==(other)
         
     | 
    
        data/lib/gamefic/script.rb
    CHANGED
    
    | 
         @@ -1,5 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Gamefic
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
              # Script classes provide code to be executed in Plots. They are accessed
         
     | 
| 
      
 4 
     | 
    
         
            +
              # through Source classes, e.g., a Source::Text object is used to find
         
     | 
| 
      
 5 
     | 
    
         
            +
              # Source::Files. 
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
       3 
7 
     | 
    
         
             
              module Script
         
     | 
| 
       4 
8 
     | 
    
         
             
                autoload :Base, 'gamefic/script/base'
         
     | 
| 
       5 
9 
     | 
    
         
             
                autoload :File, 'gamefic/script/file'
         
     | 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'gamefic/shell'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'slop'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class Gamefic::Shell::Command::Base
         
     | 
| 
      
 5 
     | 
    
         
            +
              # Execute the command
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              def run input
         
     | 
| 
      
 8 
     | 
    
         
            +
                raise "Unimplemented command"
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
              
         
     | 
| 
      
 11 
     | 
    
         
            +
              # Get the options for the command
         
     | 
| 
      
 12 
     | 
    
         
            +
              #
         
     | 
| 
      
 13 
     | 
    
         
            +
              # @return [Slop::Options]
         
     | 
| 
      
 14 
     | 
    
         
            +
              def options
         
     | 
| 
      
 15 
     | 
    
         
            +
                @options ||= Slop::Options.new
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
              
         
     | 
| 
      
 18 
     | 
    
         
            +
              # Get the help documentation for this command.
         
     | 
| 
      
 19 
     | 
    
         
            +
              #
         
     | 
| 
      
 20 
     | 
    
         
            +
              # @return [String]
         
     | 
| 
      
 21 
     | 
    
         
            +
              def help
         
     | 
| 
      
 22 
     | 
    
         
            +
                optons.to_s
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
              
         
     | 
| 
      
 25 
     | 
    
         
            +
              protected
         
     | 
| 
      
 26 
     | 
    
         
            +
              
         
     | 
| 
      
 27 
     | 
    
         
            +
              # @return [Slope::Result]
         
     | 
| 
      
 28 
     | 
    
         
            +
              def parse input
         
     | 
| 
      
 29 
     | 
    
         
            +
                parser.parse input
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
              private
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              # @return [Slop::Parser]  
         
     | 
| 
      
 35 
     | 
    
         
            +
              def parser
         
     | 
| 
      
 36 
     | 
    
         
            +
                @parser ||= Slop::Parser.new(options)
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'zip'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'tmpdir'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'gamefic/engine/tty'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'gamefic/shell'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'yaml'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class Gamefic::Shell::Command::Play < Gamefic::Shell::Command::Base
         
     | 
| 
      
 8 
     | 
    
         
            +
              include Gamefic
         
     | 
| 
      
 9 
     | 
    
         
            +
              
         
     | 
| 
      
 10 
     | 
    
         
            +
              def run input
         
     | 
| 
      
 11 
     | 
    
         
            +
                result = parse input
         
     | 
| 
      
 12 
     | 
    
         
            +
                file = result.arguments[1]
         
     | 
| 
      
 13 
     | 
    
         
            +
                raise "File not specified." if file.nil?
         
     | 
| 
      
 14 
     | 
    
         
            +
                raise "'#{file}' does not exist." if !File.exist?(file)
         
     | 
| 
      
 15 
     | 
    
         
            +
                raise "'#{file}' is a directory." if File.directory?(file)
         
     | 
| 
      
 16 
     | 
    
         
            +
                play file
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              private
         
     | 
| 
      
 20 
     | 
    
         
            +
              
         
     | 
| 
      
 21 
     | 
    
         
            +
              def decompress(zipfile, destination)
         
     | 
| 
      
 22 
     | 
    
         
            +
                Zip::File.open(zipfile) do |z|
         
     | 
| 
      
 23 
     | 
    
         
            +
                  z.each do |entry|
         
     | 
| 
      
 24 
     | 
    
         
            +
                    FileUtils.mkdir_p File.join(destination, File.dirname(entry.name))
         
     | 
| 
      
 25 
     | 
    
         
            +
                    full_path = File.join(destination, entry.name)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    if !File.exist?(full_path)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      entry.extract full_path
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              def play file
         
     | 
| 
      
 34 
     | 
    
         
            +
                Dir.mktmpdir 'gamefic_' do |dir|
         
     | 
| 
      
 35 
     | 
    
         
            +
                  puts "Loading..."
         
     | 
| 
      
 36 
     | 
    
         
            +
                  story = Plot.new(Source::File.new(File.join(dir, 'scripts')))
         
     | 
| 
      
 37 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 38 
     | 
    
         
            +
                    decompress file, dir
         
     | 
| 
      
 39 
     | 
    
         
            +
                  rescue Exception => e
         
     | 
| 
      
 40 
     | 
    
         
            +
                    puts "'#{file}' does not appear to be a valid Gamefic file."
         
     | 
| 
      
 41 
     | 
    
         
            +
                    #puts "Error: #{e.message}"
         
     | 
| 
      
 42 
     | 
    
         
            +
                    #exit 1
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                  story.script 'main'
         
     | 
| 
      
 45 
     | 
    
         
            +
                  story.metadata = YAML.load_file File.join(dir, 'metadata.yaml')
         
     | 
| 
      
 46 
     | 
    
         
            +
                  engine = Tty::Engine.new story
         
     | 
| 
      
 47 
     | 
    
         
            +
                  puts "\n"
         
     | 
| 
      
 48 
     | 
    
         
            +
                  engine.run
         
     | 
| 
      
 49 
     | 
    
         
            +
                end    
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/gamefic/shell.rb
    CHANGED
    
    | 
         @@ -1,82 +1,25 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'zip'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'tmpdir'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'getoptlong'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'gamefic/engine/tty'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
1 
     | 
    
         
             
            module Gamefic
         
     | 
| 
       7 
2 
     | 
    
         | 
| 
       8 
3 
     | 
    
         
             
              class Shell
         
     | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
      
 4 
     | 
    
         
            +
                autoload :Command, 'gamefic/shell/command'
         
     | 
| 
      
 5 
     | 
    
         
            +
                
         
     | 
| 
       10 
6 
     | 
    
         
             
                def initialize
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @commands = {}
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
       11 
9 
     | 
    
         | 
| 
      
 10 
     | 
    
         
            +
                def register cmd, cls
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @commands[cmd] = cls
         
     | 
| 
       12 
12 
     | 
    
         
             
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
                
         
     | 
| 
       13 
14 
     | 
    
         
             
                def execute
         
     | 
| 
       14 
     | 
    
         
            -
                   
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                   
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                   
     | 
| 
       19 
     | 
    
         
            -
                     
     | 
| 
       20 
     | 
    
         
            -
                      play ARGV.shift
         
     | 
| 
       21 
     | 
    
         
            -
                    when 'help'
         
     | 
| 
       22 
     | 
    
         
            -
                      help ARGV.shift
         
     | 
| 
       23 
     | 
    
         
            -
                    else
         
     | 
| 
       24 
     | 
    
         
            -
                      play cmd
         
     | 
| 
      
 15 
     | 
    
         
            +
                  command = ARGV[0]
         
     | 
| 
      
 16 
     | 
    
         
            +
                  cls = @commands[command]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  if cls.nil?
         
     | 
| 
      
 18 
     | 
    
         
            +
                    Gamefic::Shell::Command::Play.new.run(['play'] + ARGV)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  else
         
     | 
| 
      
 20 
     | 
    
         
            +
                    cls.new.run ARGV
         
     | 
| 
       25 
21 
     | 
    
         
             
                  end
         
     | 
| 
       26 
22 
     | 
    
         
             
                end
         
     | 
| 
       27 
     | 
    
         
            -
                private
         
     | 
| 
       28 
     | 
    
         
            -
                  def play file
         
     | 
| 
       29 
     | 
    
         
            -
                    if !File.exist?(file)
         
     | 
| 
       30 
     | 
    
         
            -
                      puts "'#{file}' does not exist."
         
     | 
| 
       31 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       32 
     | 
    
         
            -
                    end
         
     | 
| 
       33 
     | 
    
         
            -
                    if File.directory?(file)
         
     | 
| 
       34 
     | 
    
         
            -
                      puts "'#{file}' is not a Gamefic file."
         
     | 
| 
       35 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       36 
     | 
    
         
            -
                    end
         
     | 
| 
       37 
     | 
    
         
            -
                    Dir.mktmpdir 'gamefic_' do |dir|
         
     | 
| 
       38 
     | 
    
         
            -
                      puts "Loading..."
         
     | 
| 
       39 
     | 
    
         
            -
                      story = Plot.new(Source.new(dir + '/scripts'))
         
     | 
| 
       40 
     | 
    
         
            -
                      begin
         
     | 
| 
       41 
     | 
    
         
            -
                        decompress file, dir
         
     | 
| 
       42 
     | 
    
         
            -
                      rescue Exception => e
         
     | 
| 
       43 
     | 
    
         
            -
                        puts "'#{file}' does not appear to be a valid Gamefic file."
         
     | 
| 
       44 
     | 
    
         
            -
                        puts e.backtrace
         
     | 
| 
       45 
     | 
    
         
            -
                        exit 1
         
     | 
| 
       46 
     | 
    
         
            -
                      end
         
     | 
| 
       47 
     | 
    
         
            -
                      story.load dir + '/main'
         
     | 
| 
       48 
     | 
    
         
            -
                      engine = Tty::Engine.new story
         
     | 
| 
       49 
     | 
    
         
            -
                      puts "\n"
         
     | 
| 
       50 
     | 
    
         
            -
                      engine.run
         
     | 
| 
       51 
     | 
    
         
            -
                    end
         
     | 
| 
       52 
     | 
    
         
            -
                  end
         
     | 
| 
       53 
     | 
    
         
            -
                  def help command
         
     | 
| 
       54 
     | 
    
         
            -
                    shell_script = File.basename($0)
         
     | 
| 
       55 
     | 
    
         
            -
                    case command
         
     | 
| 
       56 
     | 
    
         
            -
                      when "play"
         
     | 
| 
       57 
     | 
    
         
            -
                        puts <<EOS
         
     | 
| 
       58 
     | 
    
         
            -
            #{shell_script} play [file]
         
     | 
| 
       59 
     | 
    
         
            -
            Play a Gamefic file on the command line.
         
     | 
| 
       60 
     | 
    
         
            -
            EOS
         
     | 
| 
       61 
     | 
    
         
            -
                      when nil, "help"
         
     | 
| 
       62 
     | 
    
         
            -
                      puts <<EOS
         
     | 
| 
       63 
     | 
    
         
            -
            #{shell_script} play [file] - play a Gamefic file
         
     | 
| 
       64 
     | 
    
         
            -
            #{shell_script} help - display this message
         
     | 
| 
       65 
     | 
    
         
            -
            #{shell_script} help [command] - display info about command
         
     | 
| 
       66 
     | 
    
         
            -
            EOS
         
     | 
| 
       67 
     | 
    
         
            -
                    else
         
     | 
| 
       68 
     | 
    
         
            -
                      puts "Unrecognized command '#{command}'"
         
     | 
| 
       69 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       70 
     | 
    
         
            -
                    end
         
     | 
| 
       71 
     | 
    
         
            -
                  end
         
     | 
| 
       72 
     | 
    
         
            -
                  def decompress(zipfile, destination)
         
     | 
| 
       73 
     | 
    
         
            -
                    Zip::File.open(zipfile) do |z|
         
     | 
| 
       74 
     | 
    
         
            -
                      z.each do |entry|
         
     | 
| 
       75 
     | 
    
         
            -
                        FileUtils.mkdir_p "#{destination}/#{File.dirname(entry.name)}"
         
     | 
| 
       76 
     | 
    
         
            -
                        entry.extract "#{destination}/#{entry.name}"
         
     | 
| 
       77 
     | 
    
         
            -
                      end
         
     | 
| 
       78 
     | 
    
         
            -
                    end
         
     | 
| 
       79 
     | 
    
         
            -
                  end
         
     | 
| 
       80 
23 
     | 
    
         
             
              end
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
              
         
     | 
| 
       82 
25 
     | 
    
         
             
            end
         
     | 
    
        data/lib/gamefic/source/file.rb
    CHANGED
    
    | 
         @@ -10,7 +10,7 @@ module Gamefic 
     | 
|
| 
       10 
10 
     | 
    
         
             
                def export path
         
     | 
| 
       11 
11 
     | 
    
         
             
                  @directories.each { |directory|
         
     | 
| 
       12 
12 
     | 
    
         
             
                    @@extensions.each { |ext|
         
     | 
| 
       13 
     | 
    
         
            -
                      abs_file = directory  
     | 
| 
      
 13 
     | 
    
         
            +
                      abs_file = File.join(directory, path + ext)
         
     | 
| 
       14 
14 
     | 
    
         
             
                      if File.file?(abs_file)
         
     | 
| 
       15 
15 
     | 
    
         
             
                        return Script::File.new(abs_file, path)
         
     | 
| 
       16 
16 
     | 
    
         
             
                      end
         
     | 
    
        data/lib/gamefic/source.rb
    CHANGED
    
    | 
         @@ -1,5 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Gamefic
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
              # Plots use Source classes to fetch scripts to be executed. The most common
         
     | 
| 
      
 4 
     | 
    
         
            +
              # type of Source class is Source::File, which searches for scripts in
         
     | 
| 
      
 5 
     | 
    
         
            +
              # a predefined list of directories on the filesystem, similar to the way
         
     | 
| 
      
 6 
     | 
    
         
            +
              # that Kernel#require works.
         
     | 
| 
      
 7 
     | 
    
         
            +
              #
         
     | 
| 
       3 
8 
     | 
    
         
             
              module Source
         
     | 
| 
       4 
9 
     | 
    
         
             
                autoload :Base, 'gamefic/source/base'
         
     | 
| 
       5 
10 
     | 
    
         
             
                autoload :File, 'gamefic/source/file'
         
     | 
    
        data/lib/gamefic/tester.rb
    CHANGED
    
    
    
        data/lib/gamefic/version.rb
    CHANGED
    
    
    
        data/lib/gamefic.rb
    CHANGED
    
    | 
         @@ -7,11 +7,6 @@ require 'gamefic/serialized' 
     | 
|
| 
       7 
7 
     | 
    
         
             
            require 'gamefic/entity'
         
     | 
| 
       8 
8 
     | 
    
         
             
            require 'gamefic/character'
         
     | 
| 
       9 
9 
     | 
    
         
             
            require "gamefic/scene"
         
     | 
| 
       10 
     | 
    
         
            -
            require "gamefic/scene/active"
         
     | 
| 
       11 
     | 
    
         
            -
            require "gamefic/scene/concluded"
         
     | 
| 
       12 
     | 
    
         
            -
            require "gamefic/scene/paused"
         
     | 
| 
       13 
     | 
    
         
            -
            require "gamefic/scene/multiplechoice"
         
     | 
| 
       14 
     | 
    
         
            -
            require "gamefic/scene/yesorno"
         
     | 
| 
       15 
10 
     | 
    
         
             
            require "gamefic/query"
         
     | 
| 
       16 
11 
     | 
    
         
             
            require "gamefic/action"
         
     | 
| 
       17 
12 
     | 
    
         
             
            require "gamefic/syntax"
         
     | 
| 
         @@ -20,4 +15,4 @@ require "gamefic/director" 
     | 
|
| 
       20 
15 
     | 
    
         
             
            require "gamefic/plot"
         
     | 
| 
       21 
16 
     | 
    
         
             
            require "gamefic/engine"
         
     | 
| 
       22 
17 
     | 
    
         
             
            require "gamefic/direction"
         
     | 
| 
       23 
     | 
    
         
            -
            require "gamefic/ 
     | 
| 
      
 18 
     | 
    
         
            +
            require "gamefic/version"
         
     |