diff --git a/fs_edit_general.lua b/fs_edit_general.lua
index 17c6479..e96f6ac 100644
--- a/fs_edit_general.lua
+++ b/fs_edit_general.lua
@@ -1514,23 +1514,18 @@ end
----------------------------------------------------------------------------
-- begin of formspecs for types of preconditions, actions and effects
--- "an internal state (i.e. of a quest)", -- 2
--- (state is the second offered option in both preconditions and effects list)
-yl_speak_up.get_fs_edit_option_p_and_e_state = function(
- pname, dialog, formspec, data, id_prefix, save_button, e,
- text_variable, text_select_value, text_select_operator,
- values_operator, check_operator, get_sorted_player_var_list_function )
-
- local var_list = get_sorted_player_var_list_function(pname)
+-- helper function for "state", "property" and "evaluate";
+-- shows dropdown for operator and input field for comparison value var_cmp_value
+yl_speak_up.get_fs_operator_based_comparison = function(data, id_prefix, save_button, e,
+ values_operator, check_operator,
+ what_is_this, text_what_is_this,
+ text_select_operator, text_select_value)
if(e) then
data.operator = math.max(1,table.indexof(values_operator, e[ id_prefix.."operator" ]))
data.var_cmp_value = e[ id_prefix.."var_cmp_value" ]
- data.variable_name = yl_speak_up.strip_pname_from_var(e[ id_prefix.."variable" ], pname)
- data.variable = table.indexof(var_list, e[ id_prefix.."variable"])
end
- local var_list_stripped = yl_speak_up.strip_pname_from_varlist(var_list, pname)
- if(not(data.variable) or data.variable < 1) then
- data.variable = 0
+ if(not(data[what_is_this]) or data[what_is_this] == "" or tostring(data[what_is_this]) == -1
+ or tostring(data[what_is_this]) == "0") then
-- not enough selected yet for saving
save_button = ""
elseif(not(data.operator) or data.operator == 1) then
@@ -1550,18 +1545,43 @@ yl_speak_up.get_fs_edit_option_p_and_e_state = function(
-- the list of available variables needs to be extended with the ones
-- the player has read access to, and the order has to be constant
-- (because dropdown just returns an index)
- return formspec..
- "label[0.2,3.3;"..text_variable.."]"..
- "label[0.2,4.3;Name of variable:]"..
- "dropdown[0.2,4.8;6.5,0.6;select_variable;"..
- "- please select -"..var_list_stripped..";"..
- tostring(data.variable + 1)..";]"..
+ return "label[0.2,3.3;"..text_what_is_this.."]"..
+ "label[0.2,4.3;Name of "..what_is_this..":]"..
"label[7.0,4.3;"..text_select_operator.."]"..
"dropdown[7.0,4.8;4.5,0.6;select_operator;"..
table.concat(check_operator, ",")..";"..
tostring(data.operator)..";]"..
"label[11.7,4.3;"..text_select_value.."]"..
field_for_value..
+ save_button
+end
+
+
+-- "an internal state (i.e. of a quest)", -- 2
+-- (state is the second offered option in both preconditions and effects list)
+yl_speak_up.get_fs_edit_option_p_and_e_state = function(
+ pname, dialog, formspec, data, id_prefix, save_button, e,
+ text_variable, text_select_value, text_select_operator,
+ values_operator, check_operator, get_sorted_player_var_list_function )
+ -- the list of available variables needs to be extended with the ones
+ -- the player has read access to, and the order has to be constant
+ -- (because dropdown just returns an index)
+ local var_list = get_sorted_player_var_list_function(pname)
+ local var_list_stripped = yl_speak_up.strip_pname_from_varlist(var_list, pname)
+ if(e) then
+ data.variable_name = yl_speak_up.strip_pname_from_var(e[ id_prefix.."variable" ], pname)
+ data.variable = table.indexof(var_list, e[ id_prefix.."variable"])
+ end
+ if(not(data.variable) or data.variable < 1) then
+ data.variable = 0
+ end
+ return formspec..
+ yl_speak_up.get_fs_operator_based_comparison(data, id_prefix, save_button, e,
+ values_operator, check_operator, "variable", text_variable,
+ text_select_operator, text_select_value)..
+ "dropdown[0.2,4.8;6.5,0.6;select_variable;"..
+ "- please select -"..var_list_stripped..";"..
+ tostring(data.variable + 1)..";]"..
"button[0.2,6.0;4.0,0.6;manage_variables;Manage variables]"..
"button[4.7,6.0;6.5,0.6;show_var_usage_edit_element;Show where this variable is used]"..
"hypertext[1.2,7.0;16.0,2.5;some_text;"..
@@ -1572,8 +1592,7 @@ yl_speak_up.get_fs_edit_option_p_and_e_state = function(
"than x seconds ago\" or \"less than x seconds ago\". This can be "..
"useful for prevending your NPC from handing out the same quest item again "..
"too quickly (players are inventive and may use your quest item for their "..
- "own needs).\n]"..
- save_button
+ "own needs).\n]"
end
@@ -1582,27 +1601,8 @@ yl_speak_up.get_fs_edit_option_p_and_e_property = function(
pname, dialog, formspec, data, id_prefix, save_button, e,
text_select_operator, values_operator, check_operator)
if(e) then
- data.operator = math.max(1,table.indexof(values_operator, e[ id_prefix.."operator" ]))
- data.var_cmp_value = e[ id_prefix.."var_cmp_value" ]
data.property = e[ id_prefix.."value"]
end
- if(not(data.property) or data.property == "") then
- -- not enough selected yet for saving
- save_button = ""
- elseif(not(data.operator) or data.operator == 1) then
- data.operator = 1
- save_button = ""
- end
- local field_for_value = "field[11.7,4.8;7.5,0.6;var_cmp_value;;"..
- minetest.formspec_escape(data.var_cmp_value or "- enter value -").."]"
- -- do not show value input field for unary operators
- -- (unary operators are diffrent for prerequirements and effects)
- if(not(data.operator)
- or (id_prefix == "p_" and (data.operator == 1 or (data.operator>=8 and data.operator<11)))
- -- "unset", "set_to_current_time"
- or (id_prefix == "r_" and (data.operator == 3 or data.operator == 4))) then
- field_for_value = "label[11.7,5.1;- not used for this operator -]"
- end
local operator_list = {}
for i, v in ipairs(check_operator) do
v2 = values_operator[i]
@@ -1618,21 +1618,16 @@ yl_speak_up.get_fs_edit_option_p_and_e_property = function(
end
-- the list of available variables needs to be extended with the ones
return formspec..
- "label[0.2,3.3;The NPC shall have the following property:]"..
- "label[0.2,4.3;Name of property:]"..
+ yl_speak_up.get_fs_operator_based_comparison(data, id_prefix, save_button, e,
+ values_operator, operator_list, "property",
+ "The NPC shall have the following property:",
+ text_select_operator, text_compare_with)..
"field[1.0,4.8;5.0,0.6;property;;"..
minetest.formspec_escape(data.property or "- enter name -").."]"..
- "label[7.0,4.3;"..text_select_operator.."]"..
- "dropdown[7.0,4.8;4.5,0.6;select_operator;"..
- table.concat(operator_list, ",")..";"..
- tostring(data.operator)..";]"..
- "label[11.7,4.3;"..text_compare_with..":]"..
- field_for_value..
"hypertext[1.2,7.0;16.0,2.5;some_text;"..
"Note: Properties are useful for NPC that have a generic "..
"behaviour and may vary their behaviour slightly.\n"..
- "]"..
- save_button
+ "]"
end
@@ -1640,8 +1635,36 @@ end
yl_speak_up.get_fs_edit_option_p_and_e_evaluate = function(
pname, dialog, formspec, data, id_prefix, save_button, e,
text_select_operator, values_operator, check_operator)
- -- TODO: actually implement
- return formspec
+ if(e) then
+ data.function_name = e[ id_prefix.."value"]
+ -- TODO: p_param1 .. p_param9
+ end
+ local operator_list = {}
+ for i, v in ipairs(check_operator) do
+ v2 = values_operator[i]
+ if( v2 ~= "quest_step_done" and v2 ~= "quest_step_not_done"
+ and v2 ~= "true_for_param" and v2 ~= "false_for_param") then
+ table.insert(operator_list, v)
+ end
+ end
+ local text_operator_and_comparison = ""
+ if(id_prefix ~= "r_") then
+ text_operator_and_comparison = yl_speak_up.get_fs_operator_based_comparison(
+ data, id_prefix, save_button, e,
+ values_operator, operator_list, "function",
+ "Execute and evaluate the following function:",
+ text_select_operator, "Compare the return value with this value:")
+ end
+ -- the list of available variables needs to be extended with the ones
+ return formspec..
+ text_operator_and_comparison..
+ -- TODO: rather a dropdown...
+ "field[1.0,4.8;5.0,0.6;property;;"..
+ minetest.formspec_escape(data.property or "- enter name -").."]"..
+ "hypertext[1.2,7.0;16.0,2.5;some_text;"..
+ "Note: Functions are called with parameters which are passed on to them. "..
+ "The function then calculates a result. This can be compared to a given value."..
+ "]"
end