ceml 0.7.13 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|