With the jump tag working, the conditional test now passes. Unfortuneately, if does't actualy work, so I need to extend the test so that it fails again:
rc = narrator:play(stage)
assert_true(rc)
assert_equal(2, stage:num_oq())
assert_equal("text", stage:oq(1).type)
assert_equal(
"You don't like it in this room. What do you want to do?",
stage:oq(1).value
)
local options = stage:oq(2).options
assert_not_nil(options)
assert_equal(2, #options)
If the condition worked, I'd only see two options until I'd visited the other two branches. Of course, it would help if I specified the condition in the first place...
<Choice>
<Option Text = "Sulk"
Next = "sulking"
/>
<Option Text = "Complain"
Next = "moaning"
/>
<Option Text = "Try The Door"
Next = "thinking"
>
<Func>
userdata.test_ran = true
return userdata.sulk == true and userdata.moan == true
</Func>
</Option>
</Choice>
So that opens up the Option tag to enclose a Func. I was going to have a Condition object and tag, ut why create an extra object when Func can do it already. William of Occam would approve, I feel :)
So the condition is a Func,. which is essentually a lua function, minus the "function foo()" at the top, and the "end" to finish up. I decided to set a flag as well, so I can test to see if it runs. Would simplify bug finding if I know for a fact whether the code ran or not.
And then
rc = narrator:play(stage)
assert_true(rc)
assert_not_nil(narrator.userdata.test_ran)
assert_true(narrator.userdata.test_ran)
And that fails because the test_ran flag never gets set, which is hardly a surprise. I need to change the Option class to incorporate the test, and to make use of it.
This is the code I'm adding to the constructor:
while true do
i = i + 1
local raw_item = xml[i]
if raw_item == nil then
break
end
self.func = Func:new(raw_item)
end
That's assuming that anything between option tags is going to be a set of Func tags (reasonable) and that there will only be one Func (although you could make a case for multiple simple tests and only proceeding if all of them evaluated true. We'll make do with it as it is for the time being; if I ever get around to writing a SceneEditor app then it probably won't matter.
We need a func to tell if an option is valid or not... and this is getting complicated enough that it's worth writing a separate test to make sure the option behaves as expected. Deja Vu, anyone?
No comments:
Post a Comment