240 lines
7.9 KiB
Lua
240 lines
7.9 KiB
Lua
|
|
-- just some handling of variables
|
|
|
|
-- TODO: handle read (and write?) access for other players
|
|
-- TODO: add a function to check if the player has read/write access
|
|
-- TODO: mark some vars as "need to be saved" while others are less important (i.e. timestamps)
|
|
|
|
-- the keys are of the form:
|
|
-- $ <blank> <player name> <blank> <variable name> (makes it easier to grant read access)
|
|
-- the values are of the form:
|
|
-- <current player name as key> : <value of variable for that player as value>
|
|
yl_speak_up.player_vars = {}
|
|
|
|
-- store when player_vars was last saved to disc
|
|
yl_speak_up.player_vars_last_save_time = 0
|
|
|
|
-- save the data to disc; either if force_save is set or enough time has passed
|
|
yl_speak_up.save_quest_variables = function(force_save)
|
|
if(not(force_save)
|
|
and (yl_speak_up.player_vars_last_save_time + yl_speak_up.player_vars_min_save_time >
|
|
math.floor(minetest.get_us_time()/1000000))) then
|
|
return
|
|
end
|
|
local json = minetest.write_json( yl_speak_up.player_vars )
|
|
-- actually store it on disk
|
|
minetest.safe_file_write(yl_speak_up.worldpath..yl_speak_up.player_vars_save_file..".json", json)
|
|
end
|
|
|
|
|
|
-- load the data from disc
|
|
yl_speak_up.load_quest_variables = function()
|
|
-- load the data from the file
|
|
local file, err = io.open(yl_speak_up.worldpath..yl_speak_up.player_vars_save_file..".json", "r")
|
|
if err then
|
|
return
|
|
end
|
|
io.input(file)
|
|
local text = io.read()
|
|
-- all values saved in the tables as such are strings
|
|
local data = minetest.parse_json(text, -1)
|
|
io.close(file)
|
|
|
|
if(type(data) ~= "table") then
|
|
return
|
|
end
|
|
for k,v in pairs(data) do
|
|
if(v == -1) then
|
|
data[ k ] = {}
|
|
end
|
|
end
|
|
yl_speak_up.player_vars = data
|
|
end
|
|
-- do so when this file is parsed
|
|
yl_speak_up.load_quest_variables()
|
|
|
|
|
|
-- new variables have to be added somehow
|
|
yl_speak_up.add_quest_variable = function(owner_name, variable_name)
|
|
local k = "$ "..tostring(owner_name).." "..tostring(variable_name)
|
|
if(not(owner_name) or not(variable_name)) then
|
|
return false
|
|
end
|
|
-- create a new empty table;
|
|
-- keys will be the names of players for which values are set
|
|
yl_speak_up.player_vars[ k ] = {}
|
|
-- a new variable was created - that deserves a forced save
|
|
yl_speak_up.save_quest_variables(true)
|
|
return true
|
|
end
|
|
|
|
|
|
-- accidentally created or no longer needed variables need to be deleted somehow
|
|
yl_speak_up.del_quest_variable = function(owner_name, variable_name)
|
|
local k = "$ "..tostring(owner_name).." "..tostring(variable_name)
|
|
if(not(owner_name) or not(variable_name)) then
|
|
return false
|
|
end
|
|
-- a variable was deleted - that deserves a forced save
|
|
yl_speak_up.save_quest_variables(true)
|
|
yl_speak_up.player_vars[ k ] = nil
|
|
end
|
|
|
|
|
|
-- set the value of a variable used by a player in an NPC;
|
|
-- returns false if the variable cannot be set (i.e. does not exist)
|
|
yl_speak_up.set_quest_variable_value = function(player_name, variable_name, new_value)
|
|
-- the owner name is alrady encoded in the variable name
|
|
local k = tostring(variable_name)
|
|
if(not(variable_name) or not(player_name) or not(yl_speak_up.player_vars[ k ])) then
|
|
return false
|
|
end
|
|
yl_speak_up.player_vars[ k ][ player_name ] = tostring(new_value)
|
|
-- a quest variable was changed - save that to disc (but no need to force it)
|
|
yl_speak_up.save_quest_variables(false)
|
|
return true
|
|
end
|
|
|
|
|
|
-- get the value of a variable used by a player in an NPC;
|
|
-- returns nil if the variable does not exist
|
|
yl_speak_up.get_quest_variable_value = function(player_name, variable_name)
|
|
-- the owner name is alrady encoded in the variable name
|
|
local k = tostring(variable_name)
|
|
if(not(variable_name) or not(player_name) or not(yl_speak_up.player_vars[ k ])) then
|
|
return nil
|
|
end
|
|
return yl_speak_up.player_vars[ k ][ player_name ]
|
|
end
|
|
|
|
|
|
-- which variables can player pname read and use in preconditions?
|
|
-- returns a sorted list
|
|
yl_speak_up.get_quest_variables_with_read_access = function(pname)
|
|
if(not(pname)) then
|
|
return {}
|
|
end
|
|
local liste = {}
|
|
for k, v in pairs(yl_speak_up.player_vars) do
|
|
local parts = string.split(k, " ")
|
|
if(parts and parts[1] and parts[1] == "$" and parts[2] and parts[2] == pname) then
|
|
table.insert(liste, k)
|
|
end
|
|
end
|
|
-- TODO: insert those vars owned by other players where this one has read access to
|
|
table.sort(liste)
|
|
return liste
|
|
end
|
|
|
|
|
|
-- which variables can player pname write and use in effects/results?
|
|
yl_speak_up.get_quest_variables_with_write_access = function(pname)
|
|
if(not(pname)) then
|
|
return {}
|
|
end
|
|
local liste = {}
|
|
for k, v in pairs(yl_speak_up.player_vars) do
|
|
local parts = string.split(k, " ")
|
|
if(parts and parts[1] and parts[1] == "$" and parts[2] and parts[2] == pname) then
|
|
table.insert(liste, k)
|
|
end
|
|
end
|
|
-- TODO: insert those vars owned by other players where this one has write access to
|
|
table.sort(liste)
|
|
return liste
|
|
end
|
|
|
|
|
|
yl_speak_up.input_fs_manage_variables = function(player, formname, fields)
|
|
local pname = player:get_player_name()
|
|
if(fields and fields.back_from_msg) then
|
|
yl_speak_up.show_fs(player, "manage_variables")
|
|
return
|
|
end
|
|
-- add a new variable?
|
|
if(fields and fields.add_variable) then
|
|
if(not(fields.add_variable_name) or fields.add_variable_name == ""
|
|
or fields.add_variable_name:trim() == "") then
|
|
yl_speak_up.show_fs(player, "msg", {
|
|
input_to = "yl_speak_up:manage_variables",
|
|
formspec = "size[6,2]"..
|
|
"label[0.2,0.5;Please enter the name of your variable!]"..
|
|
"button[1.5,1.5;2,0.9;back_from_msg;Back]"})
|
|
return
|
|
end
|
|
-- TODO: limit names to something more sensible?
|
|
fields.add_variable_name = fields.add_variable_name:trim()
|
|
local res = yl_speak_up.add_quest_variable(pname, fields.add_variable_name)
|
|
local text = "A new variable named\n \""..tostring(fields.add_variable_name)..
|
|
"\"\nhas been created."
|
|
if(not(res)) then
|
|
text = "Failed to create variable named\n \""..
|
|
tostring(fields.add_variable_name).."\"."
|
|
end
|
|
yl_speak_up.show_fs(player, "msg", {
|
|
input_to = "yl_speak_up:manage_variables",
|
|
formspec = "size[6,2]"..
|
|
"label[0.2,0.0;"..minetest.formspec_escape(text).."]"..
|
|
"button[1.5,1.5;2,0.9;back_from_msg;Back]"})
|
|
return
|
|
|
|
end
|
|
-- try to go back to the last formspec shown before this one
|
|
if(not(yl_speak_up.speak_to[pname])) then
|
|
return
|
|
end
|
|
local last_fs = yl_speak_up.speak_to[pname][ "working_at" ]
|
|
yl_speak_up.show_fs(player, last_fs)
|
|
end
|
|
|
|
|
|
yl_speak_up.get_fs_manage_variables = function(player, param)
|
|
return "size[12,4]"..
|
|
"label[2.0,-0.2;* Manage your variables *]"..
|
|
"label[0.2,1.0;Create this new variable:]"..
|
|
"field[3.7,1.3;6.0,0.6;add_variable_name;;]"..
|
|
"button[9.4,1.0;2.5,0.6;add_variable;Create variable]"..
|
|
"tooltip[add_variable;Enter the name of your new variable.]"..
|
|
-- TODO: delete variable
|
|
"button[2.0,3.5;1.0,0.6;back;Back]"
|
|
end
|
|
|
|
|
|
-- variables are personalized; they are prefixed by "$ <PLAYER_NAME> <VAR_NAME>"
|
|
|
|
-- helper function;
|
|
-- strip "$ PNAME " from variable names (but only for those owned by player with name pname)
|
|
yl_speak_up.strip_pname_from_var = function(var_name, pname)
|
|
local parts = string.split(var_name, " ")
|
|
if(parts and parts[1] and parts[1] == "$" and parts[2] and parts[2] == pname) then
|
|
table.remove(parts, 1) -- remove "$"
|
|
table.remove(parts, 1) -- remove pname
|
|
return table.concat(parts, " ")
|
|
end
|
|
return var_name
|
|
end
|
|
|
|
|
|
-- does the opposite of the function above; adds "$ PNAME " if needed
|
|
yl_speak_up.add_pname_to_var = function(var_name, pname)
|
|
local parts = string.split(var_name, " ")
|
|
if(parts and parts[1] and parts[1] ~= "$") then
|
|
return "$ "..tostring(pname).." "..tostring(var_name)
|
|
end
|
|
return var_name
|
|
end
|
|
|
|
|
|
-- helper function for yl_speak_up.input_fs_edit_option_related
|
|
-- and yl_speak_up.get_fs_edit_option_p_and_e_state
|
|
yl_speak_up.strip_pname_from_varlist = function(var_list, pname)
|
|
local var_list_text = ""
|
|
-- strip pname from the variable names
|
|
for i, v in ipairs(var_list) do
|
|
var_list[i] = yl_speak_up.strip_pname_from_var(v, pname)
|
|
-- useful for presenting a list
|
|
var_list_text = var_list_text..","..minetest.formspec_escape(tostring(var_list[i]))
|
|
end
|
|
return var_list_text
|
|
end
|