ceml 0.7.13 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/Makefile +1 -1
  2. data/VERSION +1 -1
  3. data/ceml.gemspec +62 -50
  4. data/guide/guide.html +69 -14
  5. data/guide/guide.md +74 -15
  6. data/guide/guide.pdf +0 -0
  7. data/lib/ceml/driver.rb +0 -181
  8. data/lib/ceml/lang/basic_instruction.rb +49 -0
  9. data/lib/ceml/{casting_statement.rb → lang/casting_statement.rb} +19 -9
  10. data/lib/ceml/{instruction_statements.rb → lang/instruction_statements.rb} +5 -16
  11. data/lib/ceml/{script.rb → lang/script.rb} +53 -43
  12. data/lib/ceml/lang/tt/casting.rb +432 -0
  13. data/lib/ceml/lang/tt/casting.treetop +29 -0
  14. data/lib/ceml/lang/tt/instructions.rb +1130 -0
  15. data/lib/ceml/lang/tt/instructions.treetop +86 -0
  16. data/lib/ceml/lang/tt/lexer.rb +1804 -0
  17. data/lib/ceml/{tt → lang/tt}/lexer.treetop +70 -7
  18. data/lib/ceml/lang/tt/scripts.rb +647 -0
  19. data/lib/ceml/{tt → lang/tt}/scripts.treetop +2 -2
  20. data/lib/ceml/lang.rb +10 -0
  21. data/lib/ceml/models/audition.rb +65 -0
  22. data/lib/ceml/models/bundle.rb +64 -0
  23. data/lib/ceml/models/cast.rb +108 -0
  24. data/lib/ceml/models/castable.rb +81 -0
  25. data/lib/ceml/{incident.rb → models/incident.rb} +63 -15
  26. data/lib/ceml/models/incident_model.rb +100 -0
  27. data/lib/ceml/models/incident_role_slot.rb +16 -0
  28. data/lib/ceml/models/player.rb +80 -0
  29. data/lib/ceml/models/queue.rb +12 -0
  30. data/lib/ceml/models/waiting_room.rb +40 -0
  31. data/lib/ceml/models.rb +16 -0
  32. data/lib/ceml/processor.rb +162 -0
  33. data/lib/ceml.rb +7 -14
  34. data/test/askchain.ceml +6 -0
  35. data/test/compliment.ceml +4 -0
  36. data/test/dialogues/accept.ceml +24 -0
  37. data/test/dialogues/basic_seed.ceml +26 -0
  38. data/test/dialogues/jordan.ceml +121 -0
  39. data/test/helper.rb +44 -39
  40. data/test/jane.ceml +48 -0
  41. data/test/{test_casting.rb → lang/test_casting.rb} +5 -0
  42. data/test/lang/test_instructions.rb +42 -0
  43. data/test/{test_scripts.rb → lang/test_scripts.rb} +3 -2
  44. data/test/sync.ceml +6 -0
  45. data/test/test_castable.rb +20 -0
  46. data/test/test_dialogues.rb +58 -0
  47. data/test/test_incident.rb +64 -127
  48. metadata +54 -30
  49. data/.gitignore +0 -23
  50. data/lib/ceml/confluence.rb +0 -63
  51. data/lib/ceml/role.rb +0 -61
  52. data/lib/ceml/tt/casting.treetop +0 -65
  53. data/lib/ceml/tt/instructions.treetop +0 -91
  54. data/test/test_instructions.rb +0 -27
  55. data/test/test_release.rb +0 -78
@@ -0,0 +1,49 @@
1
+ module CEML
2
+ module BasicInstruction
3
+
4
+ # TODO: bug right here
5
+ # def role; id.respond_to?(:text_value) && id.text_value.to_sym || :none; end
6
+ def role;
7
+ if id.respond_to?(:text_value)
8
+ id.text_value.to_sym
9
+ else
10
+ raise "holy fuck"
11
+ end
12
+ end
13
+
14
+ def roles
15
+ [role]
16
+ end
17
+
18
+ def text_block
19
+ defined?(:text) && text.text_value
20
+ end
21
+ def var
22
+ return varname.text_value if cmd == :record or cmd == :set or cmd == :release
23
+ (!respond_to?(:about) || about.empty?) ? nil : about.varname.text_value;
24
+ end
25
+ def key; var || text_block; end
26
+ def cmd; text_value.split.first.to_sym; end
27
+ def cond
28
+ (!respond_to?(:condition) || condition.empty?) ? nil : condition.value
29
+ end
30
+
31
+ def bytecode
32
+ code = []
33
+ code.concat case cmd
34
+ when :record; [[roles, :answered_q, {:key => key}]]
35
+ when :set; [[roles, :set, {:key => key, :value => text_block}]]
36
+ when :pick; [[roles, :pick, {:key => key, :value => text_block}]]
37
+ when :ask; [[roles, :ask_q, {:text => text_block, :q => key}],
38
+ [roles, :answered_q, {:key => key}]]
39
+ when :tell; [[roles, :send_msg, {:text => text_block}]]
40
+ when :assign; [[roles, :assign, {:text => text_block}],
41
+ [roles, :complete_assign, {:text => text_block}]]
42
+ when :release; [[roles, :release, {:cond => cond}]]
43
+ when :sync; [[roles, :sync, {:role => role}]]
44
+ end
45
+ code
46
+ end
47
+
48
+ end
49
+ end
@@ -1,28 +1,38 @@
1
1
  module CEML
2
+
2
3
  module CastingStatement
3
4
  extend Forwardable
4
5
  def_delegators :roles, :names, :[], :min
5
6
  alias_method :rolenames, :names
6
7
 
7
- def roles_to_cast(script)
8
- return [] unless type == :await
9
- roles.list.map do |r|
10
- matching = []
11
- matching << matching_text if matching_text
12
- matching += [:city] if radius
13
- c = Criteria.new(r.qualifiers, [], matching, radius, timewindow)
14
- Role.new r.name, c, r.min..r.max, []
8
+ def casting_spec
9
+ return nil unless live_casting?
10
+ matching = []
11
+ matching << matching_text.to_sym if matching_text
12
+ matching += [:city] if radius
13
+ rolespecs = roles.list.map do |r|
14
+ RoleSpec.new(r.name, Tagspec.new(r.qualifiers,[]), r.min..r.max)
15
15
  end
16
+ [type, stanza_name, matching, radius, timewindow, rolespecs]
16
17
  end
17
18
 
18
19
  def type
19
- elements.first.text_value.split.first.to_sym
20
+ elements[1].text_value.split.first.to_sym
21
+ end
22
+
23
+ def live_casting?
24
+ [:await, :accept].include?(type)
20
25
  end
21
26
 
22
27
  def max
23
28
  roles.max
24
29
  end
25
30
 
31
+ def stanza_name
32
+ return nil if stanza_marker.empty?
33
+ stanza_marker and stanza_marker.name and stanza_marker.name.text_value
34
+ end
35
+
26
36
  def within_phrase
27
37
  return if modifiers.empty?
28
38
  modifiers.elements.select{ |m| m.respond_to? :distance }.first
@@ -4,6 +4,11 @@ module CEML
4
4
  [instruction_stmt.basic_statement] + more.elements.map{ |x| x.instruction_stmt.basic_statement }
5
5
  end
6
6
 
7
+ def bytecode
8
+ # p list
9
+ list.map(&:bytecode)
10
+ end
11
+
7
12
  def instructions
8
13
  self
9
14
  end
@@ -16,21 +21,5 @@ module CEML
16
21
  def roles
17
22
  list.map{ |s| s.role.to_sym }.uniq
18
23
  end
19
-
20
- def for(roles)
21
- list.select{ |s| roles.include?(s.role.to_sym) }
22
- end
23
-
24
- def i_asks(roles)
25
- list.select do |s|
26
- s.text_value =~ /^ask/ && roles.include?(s.role.to_sym)
27
- end
28
- end
29
-
30
- def i_tell(roles)
31
- ss = list.select{ |s| s.text_value =~ /^tell/ && roles.include?(s.role.to_sym) }
32
- raise "multiple assignments for role: #{role}" if ss.size > 1
33
- ss.first
34
- end
35
24
  end
36
25
  end
@@ -6,9 +6,10 @@ module CEML
6
6
  # = casting =
7
7
  # ===========
8
8
 
9
- def roles_to_cast
10
- return [] unless cast.type == :await
11
- return cast.roles_to_cast(self)
9
+ def castable
10
+ return nil unless cast.live_casting?
11
+ args = cast.casting_spec + [bytecode]
12
+ Castable.new(*args)
12
13
  end
13
14
 
14
15
  def nabs?
@@ -66,7 +67,7 @@ module CEML
66
67
  DefaultDP = Struct.new :radius, :rolenames, :max, :type
67
68
 
68
69
  def cast
69
- return casting_statement if respond_to? :casting_statement
70
+ return elements.first.casting_statement if elements.first.respond_to? :casting_statement
70
71
  return DefaultDP.new nil, [:agents], 0, :gather
71
72
  end
72
73
 
@@ -87,7 +88,7 @@ module CEML
87
88
  end
88
89
 
89
90
  def allowed_roles
90
- allowed_roles = [:organizer, :agents, :both, :all, :everyone, :each, :players]
91
+ allowed_roles = [:organizer, :agents, :both, :all, :everyone, :each, :players, :them, :either]
91
92
  allowed_roles += cast.rolenames
92
93
  allowed_roles.uniq
93
94
  end
@@ -98,44 +99,42 @@ module CEML
98
99
  # ================
99
100
 
100
101
  def instructions
101
- return self if Instructions === self
102
- return super if defined?(super)
103
- nil
102
+ elements.first.instructions if elements.first.respond_to? :instructions
103
+ # return self if Instructions === self
104
+ # return super if defined?(super)
105
+ # nil
104
106
  end
105
107
 
106
- def instructions_for(roles)
107
- return [] unless instructions
108
- return instructions.for(expand_roles(roles))
108
+ def title
109
+ elements.first.title.title_value if elements.first.respond_to? :title
110
+ # if defined?(super)
111
+ # super.title_value
112
+ # elsif respond_to? :title_value
113
+ # self.title_value
114
+ # else nil
115
+ # end
109
116
  end
110
117
 
118
+
111
119
  def bytecode
112
120
  code = [[[:all], :start]]
121
+ # puts "instructions: #{instructions.inspect}"
113
122
  if !instructions and title
114
123
  code.concat [[[:all], :null_assign], [[:all], :complete_assign]]
115
124
  elsif instructions
116
- instructions.list.each{ |inst| code.concat inst.bytecode } if instructions
125
+ code.concat(instructions.bytecode.flatten(1))
117
126
  end
118
127
  code << [[:all], :finish]
119
128
  code
120
129
  end
121
130
 
122
- def asks(roles)
123
- return [] unless instructions
124
- instructions.i_asks([*roles])
125
- end
126
-
127
- def tell(roles)
128
- return unless instructions
129
- instructions.i_tell([*roles])
130
- end
131
-
132
131
  def validate!
133
- return unless instructions
134
- instructions.validate_instructions!(allowed_roles)
132
+ # return unless instructions
133
+ # instructions.validate_instructions!(allowed_roles)
135
134
  end
136
135
 
137
136
  def concludes_immediately?
138
- !title and instructions.asks([:agents]).empty?
137
+ !title and bytecode.none?{ |line| [:assign, :ask_q].include?(line[1]) }
139
138
  end
140
139
 
141
140
 
@@ -151,33 +150,44 @@ module CEML
151
150
  text_value
152
151
  end
153
152
 
154
- def title
155
- if defined?(super)
156
- super.title_value
157
- elsif respond_to? :title_value
158
- self.title_value
159
- else nil
160
- end
161
- end
162
-
163
153
  def name
164
154
  title || label
165
155
  end
166
156
 
167
157
  def params
168
- asks(:organizer).map do |ask|
169
- [ask.var, ask.var.capitalize, ask.text]
170
- end
158
+ bytecode.map do |line|
159
+ next unless line[0].include?(:organizer)
160
+ next unless line[1] == :ask_q
161
+ [line[2][:q], line[2][:q].capitalize, line[2][:text]]
162
+ end.compact
171
163
  end
172
164
 
173
165
  def type
174
166
  return 'mission' if title
175
167
  return 'unknown' if instructions.empty?
176
- return 'question' if not instructions.asks(:agents).empty?
177
- return 'message' if instructions.tell(:agents)
168
+ return 'question' if simple_question
169
+ return 'message' if simple_message
178
170
  return 'unknown'
179
171
  end
180
172
 
173
+ def simple_message
174
+ # puts "bytecode size: #{bytecode.size}"
175
+ # p bytecode
176
+ return unless bytecode.size == 3
177
+ # puts "bytecode core: #{bytecode[1][1]}"
178
+ return unless bytecode[1][1] == :send_msg
179
+ return bytecode[1][2][:text]
180
+ end
181
+
182
+ def simple_question
183
+ # puts "bytecode size: #{bytecode.size}"
184
+ # p bytecode
185
+ return unless bytecode.size == 4
186
+ # puts "bytecode core: #{bytecode[1][1]}"
187
+ return unless bytecode[1][1] == :ask_q
188
+ return bytecode[1][2][:text]
189
+ end
190
+
181
191
  def message?
182
192
  type == 'message'
183
193
  end
@@ -185,10 +195,10 @@ module CEML
185
195
  def label
186
196
  return title || begin
187
197
  return "unknown" unless simple?
188
- if q = instructions.asks(:agents).first
189
- "Question: #{q.text}"
190
- elsif tell = instructions.tell(:agents)
191
- "Message: #{tell}" if tell
198
+ if simple_question
199
+ "Question: #{simple_question}"
200
+ elsif simple_message
201
+ "Message: #{simple_message}"
192
202
  else
193
203
  "unknown"
194
204
  end