Module: Inform::Rules

Included in:
InformLibrary
Defined in:
lib/inform/parserm.h.rb

Overview

TODO: Perhaps this should go in the mudlib

Defined Under Namespace

Classes: More

Constant Summary collapse

SolicitedStates =
%i[asked yesorno? solicited].freeze
DefaultMoreParameters =
{
  page_index: 0, limit: 10, help: nil, done: :playing
}.freeze

Instance Method Summary collapse

Instance Method Details

#ask(s = nil) ⇒ Object



4992
4993
4994
4995
4996
4997
4998
4999
5000
# File 'lib/inform/parserm.h.rb', line 4992

def ask(s = nil)
  println s if s.is_a?(String)
  if session
    @previous ||= session.state
    session.state = :asked
  end
  # true
  session.state
end

#askedObject



5011
5012
5013
# File 'lib/inform/parserm.h.rb', line 5011

def asked
  yesorno?
end

#asked?Boolean

Returns:

  • (Boolean)


5079
5080
5081
# File 'lib/inform/parserm.h.rb', line 5079

def asked?
  session&.state == :asked
end

#completeObject



5040
5041
5042
5043
# File 'lib/inform/parserm.h.rb', line 5040

def complete
  session.state = :completing unless session.nil?
  false
end

#completedObject



5064
5065
5066
5067
# File 'lib/inform/parserm.h.rb', line 5064

def completed
  session.state = :playing unless session.nil?
  queue @input
end

#completingObject



5045
5046
5047
5048
# File 'lib/inform/parserm.h.rb', line 5045

def completing
  Incomplete() if @ambiguity
  session.state = :playing unless session.nil?
end

#completing?Boolean

Returns:

  • (Boolean)


5087
5088
5089
# File 'lib/inform/parserm.h.rb', line 5087

def completing?
  session&.state == :completing
end

#disambiguateObject



5030
5031
5032
5033
# File 'lib/inform/parserm.h.rb', line 5030

def disambiguate
  session.state = :disambiguating unless session.nil?
  false
end

#disambiguatedObject



5059
5060
5061
5062
# File 'lib/inform/parserm.h.rb', line 5059

def disambiguated
  session.state = :playing unless session.nil?
  queue @input
end

#disambiguatingObject



5035
5036
5037
5038
# File 'lib/inform/parserm.h.rb', line 5035

def disambiguating
  WhichOne() if @ambiguity
  session.state = :playing unless session.nil?
end

#disambiguating?Boolean

Returns:

  • (Boolean)


5083
5084
5085
# File 'lib/inform/parserm.h.rb', line 5083

def disambiguating?
  session&.state == :disambiguating
end

#more(text = nil, params = {}) ⇒ Object

This method supports the MoreSub verb implementation.



5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
# File 'lib/inform/parserm.h.rb', line 5119

def more(text = nil, params = {})
  params = DefaultMoreParameters.merge(params)
  unless session
    println text
    return params[:done]
  end
  input = @buffer.dup
  @more ||= More.new([], params[:page_index])

  if text
    @more.text = text
  else
    text = @more.text
  end

  case input
  when /\?/
    println params[:help] || "<Help for More goes here>"
  when /^(q|quit)$/
    @more = nil
    @prompt = nil
    prompt
    return session.state = params[:done]
  else
    text = @more.text.split('\n') if @more.text.is_a? String
    unless text.is_a?(Array)
      println "[Error: Format problem using the more command -- cannot handle given text.]"
      return session.state = params[:done]
    end

    println text[@more.page_index, params[:limit]].join("\n")

    @more.page_index += params[:limit]
  end

  percent_complete = [100, (100 * (@more.page_index.to_f / text.length)).floor].min
  @more = nil unless @more.page_index < @more.text.length

  new_line
  print "--More--(#{percent_complete}%)"

  if percent_complete < 100
    prompt " [?]: "
    session.state = :more
  else
    new_line
    prompt nil
    session.state = params[:done]
  end
end

#respondedObject



5073
5074
5075
5076
5077
# File 'lib/inform/parserm.h.rb', line 5073

def responded
  session&.state = previous_state = @previous
  @previous = nil
  session&.state || previous_state
end

#responded?(_s) ⇒ Boolean

Returns:

  • (Boolean)


5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
# File 'lib/inform/parserm.h.rb', line 5095

def responded?(_s)
  reset_io # TODO: Remove this. Why is the buffer getting a newline character added to it?
  if @buffer.empty?
    prompt
  else
    responded
    @consult_words = @input = @buffer.dup
    result = resume
    println(result)
    if result == :playing
      reset_prompt
      prompt
    end
  end
  session&.state
end

#solicit(s = nil) ⇒ Object



5051
5052
5053
5054
5055
5056
5057
# File 'lib/inform/parserm.h.rb', line 5051

def solicit(s = nil)
  if !session.nil? && !SolicitedStates.include?(session.state)
    prompt s if s.is_a?(String)
    @previous ||= session.state
  end
  session.state = :solicited unless session.nil?
end

#solicitedObject



5069
5070
5071
# File 'lib/inform/parserm.h.rb', line 5069

def solicited
  responded? @input
end

#solicited?Boolean

Returns:

  • (Boolean)


5091
5092
5093
# File 'lib/inform/parserm.h.rb', line 5091

def solicited?
  session&.state == :solicited
end

#yesorno(s = nil) ⇒ Object



5002
5003
5004
5005
5006
5007
5008
5009
# File 'lib/inform/parserm.h.rb', line 5002

def yesorno(s = nil)
  print s.to_s unless s.nil?
  unless session.nil?
    @previous ||= session.state
    session.state = :asked
  end
  session&.state || false
end

#yesorno?Boolean

Returns:

  • (Boolean)


5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
# File 'lib/inform/parserm.h.rb', line 5015

def yesorno?
  reset_io # TODO: Remove this. Why is the buffer getting a newline character added to it?
  case @buffer.split.first
  when /^(y|yes)$/i
    println(resume)
    responded
  when /^(n|no)$/i
    prompt
    responded
  else
    L__M(:Quit, 1); print "> "
    session&.state
  end
end