diff --git a/fs_edit_effects.lua b/fs_edit_effects.lua index e814ccd..9f33bfb 100644 --- a/fs_edit_effects.lua +++ b/fs_edit_effects.lua @@ -69,10 +69,11 @@ local check_operator = { "- please select -", -- 1 "set to value:", -- 2 "is no longer needed (unset)", -- 3 + "set to current time", -- 4 } -- how to store these as r_value (the actual variable is stored in r_variable, and the value in r_new_value): -local values_operator = {"", "set_to", "unset"} +local values_operator = {"", "set_to", "unset", "set_to_current_time"} -- get the list of variables the player has *write* access to @@ -132,6 +133,8 @@ yl_speak_up.show_effect = function(r) tostring(r.r_var_cmp_value).."\"" elseif(r.r_operator == "unset") then return "discard VARIABLE[ "..tostring(r.r_variable).." ] (unset)" + elseif(r.r_operator == "set_to_current_time") then + return "set VARIABLE[ "..tostring(r.r_variable).." ] to the current time" else return "ERROR: Wrong operator \""..tostring(r.r_operator).."\" for ".. "VARIABLE[ "..tostring(r.r_variable).." ]" @@ -400,6 +403,10 @@ yl_speak_up.execute_effect = function(player, n_id, o_id, r) new_value = r.r_var_cmp_value elseif(r.r_operator and r.r_operator == "unset") then new_value = nil + elseif(r.r_operator and r.r_operator == "set_to_current_time") then + -- we store the time in seconds - because microseconds would just + -- confuse the users and be too fine grained anyway + new_value = minetest.get_us_time()/1000000 else yl_speak_up.debug_msg(player, n_id, o_id, tostring(r.r_id).." ".. "state: Unsupported type: "..tostring(r.r_value)..".") diff --git a/fs_edit_general.lua b/fs_edit_general.lua index 8d56528..5d0c333 100644 --- a/fs_edit_general.lua +++ b/fs_edit_general.lua @@ -945,8 +945,9 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result, -- 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)) - or (id_prefix == "r_" and (data.operator == 3))) then + 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.2,5.1;- not used for this operator -]" end -- the list of available variables needs to be extended with the ones @@ -964,7 +965,16 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result, table.concat(check_operator, ",")..";".. tostring(data.operator)..";]".. "label[11.2,4.3;"..text_select_value.."]".. - field_for_value + field_for_value.. + "hypertext[1.2,6.0;16.0,2.5;some_text;".. + "Note: Each variable is player-specific and will be set and ".. + "checked for the player that currently talks to your NPC.\n".. + "Note: You can set a variable to the current time in an effect. ".. + "After that, use a precondition to check if that variable was set \"more ".. + "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]" -- "a block somewhere", -- 3 -- (block is the third offered option in both preconditions and effects list) diff --git a/fs_edit_preconditions.lua b/fs_edit_preconditions.lua index 5c06977..60b6b98 100644 --- a/fs_edit_preconditions.lua +++ b/fs_edit_preconditions.lua @@ -92,11 +92,14 @@ local check_operator = { "< (is smaller)", -- 7 "not (logically invert)", -- 8 "is_set (has a value)", -- 9 - "is_unset (has no value)" -- 10 + "is_unset (has no value)", -- 10 + "more than x seconds ago", -- 11 + "less than x seconds ago", -- 12 } -- how to store these as p_value (the actual variable is stored in p_variable, and the value in p_cmp_value): -local values_operator = {"", "==", "~=", ">=", ">", "<=", "<", "not", "is_set", "is_unset"} +local values_operator = {"", "==", "~=", ">=", ">", "<=", "<", "not", "is_set", "is_unset", + "more_than_x_seconds_ago","less_than_x_seconds_ago"} -- some internal ones... local check_variable = { @@ -146,6 +149,12 @@ yl_speak_up.show_precondition = function(p) return "VALUE_OF[ "..tostring(p.p_variable).." ] ~= nil (is_set)" elseif(p.p_operator == "is_unset") then return "VALUE_OF[ "..tostring(p.p_variable).." ] == nil (is_unset)" + elseif(p.p_operator == "more_than_x_seconds_ago") then + return "VALUE_OF[ "..tostring(p.p_variable).." ] was set to current time ".. + "*more* than "..tostring(p.p_var_cmp_value).." seconds ago" + elseif(p.p_operator == "less_than_x_seconds_ago") then + return "VALUE_OF[ "..tostring(p.p_variable).." ] was set to current time ".. + "*less* than "..tostring(p.p_var_cmp_value).." seconds ago" end if(p.p_var_cmp_value == "") then return "VALUE_OF[ "..tostring(p.p_variable).." ] "..tostring(p.p_operator).." \"\"" @@ -276,7 +285,7 @@ yl_speak_up.eval_precondition = function(player, n_id, p) if(tonumber(var_val) and tonumber(p.p_var_cmp_value)) then return tonumber(var_val) >= tonumber(p.p_var_cmp_value) -- fallback: compare as strings - else + else return tostring(var_val) >= tostring(p.p_var_cmp_value) end elseif(p.p_operator == ">") then @@ -297,6 +306,18 @@ yl_speak_up.eval_precondition = function(player, n_id, p) else return tostring(var_val) < tostring(p.p_var_cmp_value) end + elseif(p.p_operator == "more_than_x_seconds_ago") then + if(not(tonumber(var_val)) or not(tonumber(p.p_var_cmp_value))) then + return true + end + return (tonumber(var_val) + tonumber(p.p_var_cmp_value)) < + minetest.get_us_time()/1000000 + elseif(p.p_operator == "less_than_x_seconds_ago") then + if(not(tonumber(var_val)) or not(tonumber(p.p_var_cmp_value))) then + return false + end + return (tonumber(var_val) + tonumber(p.p_var_cmp_value)) > + minetest.get_us_time()/1000000 end -- unsupported operator return false