Sha256: 5593f80570024e3bb73084204a3315ce81a76627c6065dc986ac3649ab6b1e27

Contents?: true

Size: 1.35 KB

Versions: 2

Compression:

Stored size: 1.35 KB

Contents

module Gamefic
  module Tty
    # A simple engine for running turn-based, single-character Gamefic plots.
    #
    class Engine
      # @return [Plot]
      attr_reader :plot

      # @return [User]
      attr_reader :user

      # @return [Character]
      attr_reader :character

      # @param plot [Plot]
      # @param user [User]
      def initialize(plot: Gamefic::Plot.new, user: Gamefic::Tty::User.new)
        @plot = plot
        @user = user
        @character = @plot.introduce
        @plot.ready
      end

      # Run the plot to its conclusion.
      #
      def run
        turn until @plot.concluding?
        @user.update @character.output
      end

      # Create an engine and run the plot.
      #
      # @param plot [Plot]
      # @param user [User]
      # @return [Engine]
      def self.run(plot: Gamefic::Plot.new, user: Gamefic::Tty::User.new)
        engine = new(plot: plot, user: user)
        engine.run
        engine
      end

      # Run a single turn.
      #
      def turn
        send_and_receive
        @plot.update
        @plot.ready
      end

      private

      def send_and_receive
        @user.update @character.output
        return unless @character.queue.empty?

        @character.queue.push @user.query("#{@character.output[:prompt]} ")
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
gamefic-tty-3.0.1 lib/gamefic-tty/engine.rb
gamefic-tty-3.0.0 lib/gamefic-tty/engine.rb