added fs_edit_actions.lua and necessary sourroundings

This commit is contained in:
Sokomine 2021-06-12 21:17:58 +02:00
parent 62cfd61e8a
commit 5d82cbc32d
6 changed files with 126 additions and 8 deletions

View File

@ -32,6 +32,9 @@ yl_speak_up.trade_max_cols = 4
-- how many prerequirements can the player define per dialog option?
yl_speak_up.max_prerequirements = 12
-- how many actions can there be per dialog option?
-- for now, more than one doesn't make sense
yl_speak_up.max_actions = 1
-- how many effects can the player define per dialog option?
yl_speak_up.max_result_effects = 6

95
fs_edit_actions.lua Normal file
View File

@ -0,0 +1,95 @@
-- Which diffrent types of actions are available?
-- -> The following fields are part of an action:
-- a_id the ID/key of the action
-- a_type selected from values_what
-- a_value used to store the subtype of a_type
--
-- on_failure: TODO - does this make sense here?
-- r_value alternate target dialog if the previous *effect* failed
--
-- Note: Trades are not stored as actions - they are stored in
-- dialog.trades[ trade_id ] with <trade_id> == "<d_id> <o_id>"
--
-- some helper lists for creating the formspecs and evaulating
-- the player's answers:
-- general direction of what could make up an action
local check_what = {
"- please select -",
"No action (default).", -- 2
"Normal trade - one item(stack) for another item(stack).", -- 3
"The NPC gives something to the player (i.e. a quest item).", -- 4
"The player is expected to give something to the NPC (i.e. a quest item).", -- 5
"The player has to manually enter a password or passphrase or some other text.", -- 6
"The player has to move virtual items in a virtual inventory to the right position.", -- 7
"Call custom functions that are supposed to be overridden by the server.", -- 8
}
-- how to store these as a_type in the action:
local values_what = {"", "none", "trade", "npc_gives", "npc_wants", "text_input", "puzzle", "custom"}
-- returns a human-readable text as description of the action
-- (as shown in the edit options dialog and in the edit effect formspec)
yl_speak_up.show_action = function(a)
if(not(a.a_type) or a.a_type == "" or a.a_type == "none") then
return "(nothing): Nothing to do. No action."
elseif(a.a_type == "trade") then
return "trade:" -- TODO show ation text
elseif(a.a_type == "npc_gives") then
return "npc_gives:" -- TODO show ation text
elseif(a.a_type == "npc_wants") then
return "npc_wants:" -- TODO show ation text
elseif(a.a_type == "text_input") then
return "text_input:" -- TODO show ation text
elseif(a.a_type == "puzzle") then
return "puzzle:" -- TODO show ation text
elseif(a.a_type == "custom") then
return "custom:" -- TODO show ation text
end
-- fallback
return tostring(a.a_value)
end
yl_speak_up.execute_all_actions = function(player, actions, o_id)
-- TODO: implement
end
yl_speak_up.execute_action = function(player, n_id, o_id, r)
-- TODO: implement. boils down to showing formspecs
-- fallback: unkown type
return false
end
-- these are only wrapper functions for those in fs_edit_general.lua
yl_speak_up.input_fs_edit_actions = function(player, formname, fields)
return yl_speak_up.input_fs_edit_option_related(player, formname, fields,
"a_", "actions", yl_speak_up.max_actions,
"(A)ctions", "tmp_action",
nil, -- unused - no block operations
values_what, {}, {}, {}, {},
check_what, {}, {}, {}, {},
nil, -- no variables
"edit_actions"
)
end
yl_speak_up.get_fs_edit_actions = function(player, table_click_result)
return yl_speak_up.get_fs_edit_option_related(player, table_click_result,
"a_", "actions", yl_speak_up.max_actions,
"(A)ctions", "tmp_action",
"What do you want to happen in this (A)ction?",
check_what, {}, {}, {}, {},
nil, -- no variables
yl_speak_up.show_action,
"table_of_elements",
nil, nil, nil, -- no variable handling here
nil -- nothing block-related to do here
)
end

View File

@ -243,7 +243,7 @@ yl_speak_up.input_fs_edit_option_related = function(player, formname, fields,
-- comparison value for a variable (same for both preconditions and effects)
elseif(fields.var_cmp_value
and data and data.what and data.what == 2) then
and data and data.what and data.what == 2 and id_prefix ~= "a_") then
data.var_cmp_value = fields.var_cmp_value
-- text for a chat message
@ -289,14 +289,14 @@ yl_speak_up.input_fs_edit_option_related = function(player, formname, fields,
return
end
-- "an internal state (i.e. of a quest)", -- 2
if(data.what == 2) then
if(data.what == 2 and id_prefix ~= "a_") then
v[ id_prefix.."value" ] = "expression"
v[ id_prefix.."operator" ] = values_operator[ data.operator ]
v[ id_prefix.."var_cmp_value" ] = (data.var_cmp_value or "")
v[ id_prefix.."variable" ] = data.variable_name
-- "a block somewhere", -- 3
elseif(data.what == 3) then
elseif(data.what == 3 and id_prefix ~= "a_") then
v[ id_prefix.."value" ] = values_block[ data.block ]
if(not(data.block_pos) or not(data.node_data) or not(data.node_data.name)) then
yl_speak_up.show_fs(player, "msg", {
@ -605,7 +605,7 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result,
-- "an internal state (i.e. of a quest)", -- 2
-- (state is the second offered option in both preconditions and effects list)
if(data.what and data.what == 2) then
if(data.what and data.what == 2 and id_prefix ~= "a_") then
if(not(data.variable) or data.variable == 1) then
data.variable = 1
-- not enough selected yet for saving
@ -642,7 +642,7 @@ yl_speak_up.get_fs_edit_option_related = function(player, table_click_result,
-- "a block somewhere", -- 3
-- (block is the third offered option in both preconditions and effects list)
elseif(data.what and data.what == 3) then
elseif(data.what and data.what == 3 and id_prefix ~= "a_") then
local block_pos_str = "- none set -"
local node = {name = "- unknown -", param2 = "- unkown -"}
if(not(block_pos) and data and data.block_pos) then

View File

@ -42,7 +42,7 @@ yl_speak_up.input_edit_option_dialog = function(player, formname, fields)
yl_speak_up.show_fs(player, "talk", {n_id = n_id, d_id = d_id})
return
end
--[[ -- TODO
-- for now, there's only trade as action
if(fields.table_of_actions) then
local trade_id = tostring(d_id).." "..tostring(o_id)
@ -62,9 +62,9 @@ yl_speak_up.input_edit_option_dialog = function(player, formname, fields)
-- create a new trade for this dialog and option - with ID "<d_id> <o_id>"
yl_speak_up.show_fs(player, "add_trade_simple", tostring(d_id).." "..tostring(o_id))
return
--]]
-- the player wants to see the previous option/answer
elseif(fields.edit_option_prev) then
if(fields.edit_option_prev) then
-- sort all options by o_sort
local sorted_list = yl_speak_up.get_sorted_options(n_dialog.d_options, "o_sort")
local o_found = o_id
@ -93,6 +93,7 @@ yl_speak_up.input_edit_option_dialog = function(player, formname, fields)
{n_id = n_id, d_id = d_id, o_id = o_found, caller="next option"})
return
--[[ TODO handle elsewhere
-- show the trade associated with this dialog and option
elseif(fields.effect_show_trade) then
-- remember which option was selected
@ -102,6 +103,7 @@ yl_speak_up.input_edit_option_dialog = function(player, formname, fields)
-- show the trade with ID "<d_id> <o_id>"
yl_speak_up.show_fs(player, "trade_simple", tostring(d_id).." "..tostring(o_id))
return
--]]
-- the player clicked on a precondition
elseif(fields.table_of_preconditions) then
@ -110,6 +112,13 @@ yl_speak_up.input_edit_option_dialog = function(player, formname, fields)
yl_speak_up.show_fs(player, "edit_preconditions", fields.table_of_preconditions)
return
-- the player clicked on an action
elseif(fields.table_of_actions) then
-- remember which option was selected
yl_speak_up.speak_to[pname].o_id = o_id
yl_speak_up.show_fs(player, "edit_actions", fields.table_of_actions)
return
-- the player clicked on an effect
elseif(fields.table_of_effects) then
-- remember which option was selected
@ -166,6 +175,7 @@ yl_speak_up.get_fs_edit_option_dialog = function(player, n_id, d_id, o_id)
end
local list_of_actions = ""
-- TODO: build the same way as list of preconditions and effects
if(dialog.trades and dialog.trades[ tostring(d_id).." "..tostring(o_id) ]) then
local tr = dialog.trades[ tostring(d_id).." "..tostring(o_id)]
-- show the trade in the result/effects list

View File

@ -23,6 +23,8 @@ dofile(modpath .. "show_fs.lua")
dofile(modpath .. "fs_edit_general.lua")
-- edit preconditions (can be reached through edit options dialog)
dofile(modpath .. "fs_edit_preconditions.lua")
-- edit actions (can be reached through edit options dialog)
dofile(modpath .. "fs_edit_actions.lua")
-- edit effects (can be reached through edit options dialog)
dofile(modpath .. "fs_edit_effects.lua")
-- edit options dialog (detailed configuration of options in edit mode)

View File

@ -45,6 +45,10 @@ minetest.register_on_player_receive_fields( function(player, formname, fields)
elseif formname == "yl_speak_up:edit_preconditions" then
yl_speak_up.input_fs_edit_preconditions(player, formname, fields)
return true
-- handled in fs_edit_actions.lua
elseif formname == "yl_speak_up:edit_actions" then
yl_speak_up.input_fs_edit_actions(player, formname, fields)
return true
-- handled in fs_edit_effects.lua
elseif formname == "yl_speak_up:edit_effects" then
yl_speak_up.input_fs_edit_effects(player, formname, fields)
@ -142,6 +146,10 @@ yl_speak_up.show_fs = function(player, fs_name, param)
minetest.show_formspec(pname, "yl_speak_up:edit_preconditions",
yl_speak_up.get_fs_edit_preconditions(player, param))
elseif(fs_name == "edit_actions") then
minetest.show_formspec(pname, "yl_speak_up:edit_actions",
yl_speak_up.get_fs_edit_actions(player, param))
elseif(fs_name == "edit_effects") then
minetest.show_formspec(pname, "yl_speak_up:edit_effects",
yl_speak_up.get_fs_edit_effects(player, param))