ceml 0.7.13 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Makefile +1 -1
- data/VERSION +1 -1
- data/ceml.gemspec +62 -50
- data/guide/guide.html +69 -14
- data/guide/guide.md +74 -15
- data/guide/guide.pdf +0 -0
- data/lib/ceml/driver.rb +0 -181
- data/lib/ceml/lang/basic_instruction.rb +49 -0
- data/lib/ceml/{casting_statement.rb → lang/casting_statement.rb} +19 -9
- data/lib/ceml/{instruction_statements.rb → lang/instruction_statements.rb} +5 -16
- data/lib/ceml/{script.rb → lang/script.rb} +53 -43
- data/lib/ceml/lang/tt/casting.rb +432 -0
- data/lib/ceml/lang/tt/casting.treetop +29 -0
- data/lib/ceml/lang/tt/instructions.rb +1130 -0
- data/lib/ceml/lang/tt/instructions.treetop +86 -0
- data/lib/ceml/lang/tt/lexer.rb +1804 -0
- data/lib/ceml/{tt → lang/tt}/lexer.treetop +70 -7
- data/lib/ceml/lang/tt/scripts.rb +647 -0
- data/lib/ceml/{tt → lang/tt}/scripts.treetop +2 -2
- data/lib/ceml/lang.rb +10 -0
- data/lib/ceml/models/audition.rb +65 -0
- data/lib/ceml/models/bundle.rb +64 -0
- data/lib/ceml/models/cast.rb +108 -0
- data/lib/ceml/models/castable.rb +81 -0
- data/lib/ceml/{incident.rb → models/incident.rb} +63 -15
- data/lib/ceml/models/incident_model.rb +100 -0
- data/lib/ceml/models/incident_role_slot.rb +16 -0
- data/lib/ceml/models/player.rb +80 -0
- data/lib/ceml/models/queue.rb +12 -0
- data/lib/ceml/models/waiting_room.rb +40 -0
- data/lib/ceml/models.rb +16 -0
- data/lib/ceml/processor.rb +162 -0
- data/lib/ceml.rb +7 -14
- data/test/askchain.ceml +6 -0
- data/test/compliment.ceml +4 -0
- data/test/dialogues/accept.ceml +24 -0
- data/test/dialogues/basic_seed.ceml +26 -0
- data/test/dialogues/jordan.ceml +121 -0
- data/test/helper.rb +44 -39
- data/test/jane.ceml +48 -0
- data/test/{test_casting.rb → lang/test_casting.rb} +5 -0
- data/test/lang/test_instructions.rb +42 -0
- data/test/{test_scripts.rb → lang/test_scripts.rb} +3 -2
- data/test/sync.ceml +6 -0
- data/test/test_castable.rb +20 -0
- data/test/test_dialogues.rb +58 -0
- data/test/test_incident.rb +64 -127
- metadata +54 -30
- data/.gitignore +0 -23
- data/lib/ceml/confluence.rb +0 -63
- data/lib/ceml/role.rb +0 -61
- data/lib/ceml/tt/casting.treetop +0 -65
- data/lib/ceml/tt/instructions.treetop +0 -91
- data/test/test_instructions.rb +0 -27
- 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
|
8
|
-
return
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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.
|
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
|
10
|
-
return
|
11
|
-
|
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
|
-
|
102
|
-
return
|
103
|
-
|
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
|
107
|
-
|
108
|
-
|
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
|
-
|
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
|
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
|
-
|
169
|
-
|
170
|
-
|
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
|
177
|
-
return 'message' if
|
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
|
189
|
-
"Question: #{
|
190
|
-
elsif
|
191
|
-
"Message: #{
|
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
|