diff --git a/custom_functions_you_can_override.lua b/custom_functions_you_can_override.lua index f935455..9bb0fb2 100644 --- a/custom_functions_you_can_override.lua +++ b/custom_functions_you_can_override.lua @@ -204,7 +204,6 @@ yl_speak_up.custom_functions_r_ = {} -- example function for preconditions: yl_speak_up.custom_functions_p_[ "example function" ] = { - function_call = "yl_speak_up.custom_example_function", description = "This function is just an example. It tells the player its parameters.", param1_text = "1. Parameter:", param1_desc = "This is the value passed to the function as first parameter.", @@ -224,17 +223,36 @@ yl_speak_up.custom_functions_p_[ "example function" ] = { param8_desc = "This is the value passed to the function as 8. parameter.", param9_text = "9. Parameter:", param9_desc = "This is the value passed to the function as 9. parameter.", + -- the actual implementation of the function + code = function(player, n_id, p) + local pname = player:get_player_name() + local str = "" + for i = 1,9 do + str = str.."\n\tParameter "..tostring(i)..": "..tostring(p["p_param"..tostring(i)]) + end + minetest.chat_send_player(pname, "Checking precondition "..tostring(p.p_id).. + " for NPC with ID "..tostring(n_id)..": Executing custom function ".. + tostring(p.p_value).." with the following parameters:".. + str.."\n(This function just tells you its parameters and returns true.)") + -- this function is just for demonstration; it always returns true + return true + end, } -yl_speak_up.custom_functions_p_[ "get_level_of_player" ] = { - function_call = "yl_speak_up.get_player_level", - description = "Get the level the player has achieved.", +yl_speak_up.custom_functions_p_[ "get_xp_of_player" ] = { + description = "Get the xp the player has achieved (requires xp_redo).", + code = function(player, n_id, p) + local pname = player:get_player_name() + if(minetest.get_modpath("xp_redo")) then + return xp_redo.get_xp(pname) + end + return 0 + end } -- TODO: actually implement these as examples yl_speak_up.custom_functions_r_[ "set_variable_to_random_number" ] = { - function_call = "yl_speak_up.set_variable_to_random_number", description = "Set a variable to a random number.", param1_text = "Name of the variable:", param1_desc = "Which variable do you want to set to a random number?", @@ -245,7 +263,6 @@ yl_speak_up.custom_functions_r_[ "set_variable_to_random_number" ] = { } yl_speak_up.custom_functions_r_[ "set_variable_to_random_value_from_list" ] = { - function_call = "yl_speak_up.select_random_value_from_list", description = "Set a variable to a random value from a list.", param1_text = "Name of the variable:", param1_desc = "Which variable do you want to set to a random value from your list?", @@ -257,7 +274,6 @@ yl_speak_up.custom_functions_r_[ "set_variable_to_random_value_from_list" ] = { -- example function for results/effects: yl_speak_up.custom_functions_r_[ "example function" ] = { - function_call = "yl_speak_up.custom_example_function", -- Describe here in short form what your function does: description = "This function is just an example. It tells the player its parameters.", param1_text = "1. Parameter:", diff --git a/exec_eval_preconditions.lua b/exec_eval_preconditions.lua index 9099a46..091e203 100644 --- a/exec_eval_preconditions.lua +++ b/exec_eval_preconditions.lua @@ -262,7 +262,18 @@ yl_speak_up.eval_precondition = function(player, n_id, p, other_options_true_or_ return yl_speak_up.eval_precondition_with_operator(p, properties[p.p_value]) elseif(p.p_type == "evaluate") then - return true -- TODO + if(not(player) or not(p.p_value)) then + return false + end + local custom_data = yl_speak_up.custom_functions_p_[p.p_value] + if(not(custom_data) or not(custom_data.code)) then + return false + end + local fun = custom_data.code + -- actually call the function + local ret = fun(player, n_id, p) + -- compare the result with wat is expected + return yl_speak_up.eval_precondition_with_operator(p, ret) elseif(p.p_type == "block") then if(not(p.p_pos) or type(p.p_pos) ~= "table" or not(p.p_pos.x) or not(p.p_pos.y) or not(p.p_pos.z)) then diff --git a/fs_edit_preconditions.lua b/fs_edit_preconditions.lua index 1566be7..c77500d 100644 --- a/fs_edit_preconditions.lua +++ b/fs_edit_preconditions.lua @@ -246,8 +246,9 @@ yl_speak_up.show_precondition = function(p, pname) str = str.."," end end + local i_op = math.max(1,table.indexof(values_operator, p.p_operator)) return "FUNCTION["..tostring(p.p_value).."]".. - "("..str..") "..tostring(check_operator[p.p_operator]).. + "("..str..") "..tostring(check_operator[i_op]).. " "..tostring(p.p_var_cmp_value) elseif(p.p_type == "block") then if(not(p.p_pos) or type(p.p_pos) ~= "table"