When last we looked at conditional options in menus, we had this:
1) Failure (narrator_tests.test_condition1):
test_narrator.lua:655: nil not expected but was one
Which is this assertion:
assert_not_nil(narrator.userdata.test_ran)
That's still failing. Since we're now fairly confident that the Func and Option
code is working as we expect, the chances are that the func isn't being called.
So that means we need to look at Narrator.
Currently the "choice_show" handler looks like this:
elseif item.type == "choice_show" then
interface:choice_show(item.options)
I don't want to push the conditional evaluation into the interface code
so we need to expand this a bit, making a opy of the options array containing
only options that pass the test.
Let's start by moving the code into its own method
elseif item.type == "choice_show" then
self:do_choice_show(interface, item)
And then
function Narrator:do_choice_show(interface, item)
interface:choice_show(item.options)
end
Now: about that loop:
function Narrator:do_choice_show(interface, item)
local i, v
local valid_opts = {}
for i,v in ipairs(item.options) do
--
-- if the test is absent, that means it's always valid
--
if v.func == nil then
table.insert(valid_opts, v)
--
-- if we get to this one, we have a test
-- so we run it to see if it should be included
--
elseif v:test(self.userdata) then
table.insert(valid_opts, v)
end
end
interface:choice_show(valid_opts)
end
And, slight to mmy surprise, that passes the test. We're not done yet, however.
No comments:
Post a Comment