Guest User

Untitled

a guest
Jun 22nd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.61 KB | None | 0 0
  1. require 'rubygems'
  2.  
  3. require 'digest/sha1'
  4. require 'rgl/adjacency'
  5. require 'rgl/dot'
  6. class Dialog
  7. attr_accessor :block, :steps, :first_step, :session
  8. def initialize(&block)
  9. self.steps = {}
  10. instance_eval(&block)
  11. end
  12.  
  13. def step(name, &block)
  14. st = Step.new({:name => name, :dialog => self}, &block)
  15. self.steps[st.hash_id] = st
  16. self.first_step = st unless self.first_step
  17. end
  18.  
  19. def process(session, hash_id = nil)
  20. self.session = session
  21. step = hash_id && self.steps[hash_id] ? self.steps[hash_id] : self.first_step
  22. step.process
  23. end
  24.  
  25. def self.secret_phrase
  26. 'hello baby'
  27. end
  28.  
  29. def self.step_hash(name)
  30. Digest::SHA1.hexdigest(Dialog.secret_phrase + name.to_s)
  31. end
  32.  
  33. def to_graph
  34. dg = RGL::DirectedAdjacencyGraph.new
  35. self.steps.each do |key, step|
  36. step.run_type = :only_text
  37. parts = step.process
  38. dg.add_vertex(step.vertex_name)
  39. end
  40.  
  41. self.steps.each do |key, step|
  42. step.parts.select{|v| v[0] == 'answer'}.each{|v| dg.add_edge(self.steps[key].vertex_name, self.steps[v[2]].vertex_name)}
  43. end
  44.  
  45.  
  46. dg.write_to_graphic_file('jpg')
  47. end
  48.  
  49. end
  50.  
  51.  
  52. class Step
  53. attr_accessor :block, :hash_id, :dialog, :name, :parts, :redirect_step, :run_type
  54. def initialize(options = {}, &block)
  55. self.block = block
  56. self.name = options[:name]
  57. self.dialog = options[:dialog]
  58. self.parts = []
  59. self.hash_id = Dialog.step_hash(options[:name])
  60. end
  61.  
  62. def part_def(type = :text, &block)
  63. if self.redirect_step || (self.run_type == :only_text && type != :text)
  64. nil
  65. else
  66. instance_eval(&block)
  67. end
  68. end
  69.  
  70. def process
  71. res = instance_eval(&self.block)
  72. if res.is_a?(Symbol)
  73. next_button res
  74. end
  75. self.redirect_step ? self.redirect_step.process : self.parts
  76. end
  77.  
  78. def message(text)
  79. part_def do
  80. self.parts << ['text', text]
  81. end
  82. end
  83.  
  84. def answer(hash)
  85. part_def do
  86. text, step = hash.to_a.flatten
  87. self.parts << ['answer', text, Dialog.step_hash(step)]
  88. end
  89. end
  90.  
  91. def has(name)
  92. part_def :action do
  93. !self.dialog.session[name].nil?
  94. end
  95. end
  96.  
  97. def set(name, value)
  98. part_def :action do
  99. self.dialog.session[name] = value
  100. end
  101. end
  102.  
  103. def next_button(name)
  104. part_def do
  105. self.parts << ['answer', '[Next]', Dialog.step_hash(name)]
  106. end
  107. end
  108.  
  109. def exit
  110. part_def do
  111. self.parts << ['exit']
  112. end
  113. end
  114.  
  115. def go_to(name)
  116. part_def :action do
  117. self.redirect_step = self.dialog.steps[Dialog.step_hash(name)]
  118. end
  119. end
  120.  
  121. def give_quest
  122. part_def :action do
  123. puts 'Дали квест!'
  124. end
  125. end
  126.  
  127. def player
  128. {:charm => 10}
  129. end
  130.  
  131. def vertex_name
  132. self.name.to_s + ": " + self.parts.select{|v| v[0] == 'text' }.map{|v| v[1]}.join("\n")
  133. end
  134.  
  135. end
  136.  
  137.  
  138.  
  139. di = Dialog.new do
  140. step :greeting do
  141. message "Hello"
  142. answer "Let me buy something" => :shop
  143. answer "What's going on recently?" => :whats_new
  144. answer "No, nevermind" => :exit
  145. end
  146.  
  147. step :whats_new do
  148. go_to :whats_new_good_mood if has :bought_something
  149. message "No, not gonna tell you anything. Maybe you only if you'd buy something..."
  150.  
  151. answer "Okay man, show me the stuff" => :shop
  152. answer "Oh really? How about me using persuation" => :persuation
  153. answer "Oh really? Fuck you man, not gonna waste time" => :exit
  154. end
  155.  
  156. step :persuation do
  157. if player[:charm] > 5
  158. set :persuation_success, true
  159. go_to :whats_new_good_mood
  160. else
  161. go_to :persuation_failed
  162. end
  163. end
  164.  
  165. step :persuation_failed do
  166. message "Fuck you, man"
  167. :whats_new
  168. end
  169.  
  170.  
  171. step :whats_new_good_mood do
  172. message "You good man" if has :persuation_success
  173. message "Ok. Mr Sally yesterday win $400 in a lottery"
  174. :greeting
  175. end
  176.  
  177. step :whats_new_bought do
  178. message "Stange things happen around"
  179.  
  180. answer "Ok, I'll fix it for ya" => :quest_taken
  181. answer "No, I'd better buy something" => :shop
  182. answer "Nevermind" => :exit
  183. end
  184.  
  185. step :quest_taken do
  186. message "Hurry up!"
  187. give_quest :title => "asdad"
  188. give_quest_part, :fight_win => 5
  189. :exit
  190. end
  191.  
  192. step :shop do
  193. message "I got this sword"
  194.  
  195. answer "Ok, I take it [buy sword]" => :buy
  196. answer "Fuck you!" => :greeting
  197. end
  198. step :buy do
  199. message "Okay, here's the sword"
  200. # player -= 50.gold
  201. set :bought_something, true
  202. :greeting
  203. end
  204.  
  205. step :exit do
  206. message "Good bye then"
  207. exit
  208. end
  209. end
Add Comment
Please, Sign In to add comment