diff --git a/README.md b/README.md index 4b4c460..037ba90 100644 --- a/README.md +++ b/README.md @@ -120,3 +120,6 @@ The trade list can be accessed from the NPC's inventory. If there are trades that ought to show up in the general trade list (i.e. not only attached to dialog options), then a button "Let's trade" will be shown as option for the first dialog. + +Trades that are attached to the trade list (and not dialog options) can be +added and deleted without entering edit mode ("I am your owner. ..."). diff --git a/trade_list.lua b/trade_list.lua index 4f396ea..6dc71cf 100644 --- a/trade_list.lua +++ b/trade_list.lua @@ -112,9 +112,8 @@ yl_speak_up.get_fs_trade_list = function(player) "label[1,1;Sorry. There are currently no offers available.]") end - -- button "add trade" for those who can edit the NPC - if((yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id) - and (yl_speak_up.speak_to[pname].n_id)) then + -- button "add trade" for those who can edit the NPC (entering edit mode is not required) + if(yl_speak_up.may_edit_npc(player, n_id)) then table.insert(formspec, "button["..tostring(yl_speak_up.trade_max_cols * 4 - 2.2).. ",0.2;2.0,0.9;trade_list_add_trade;Add trade]") diff --git a/trade_simple.lua b/trade_simple.lua index 6d2f77f..f02ce43 100644 --- a/trade_simple.lua +++ b/trade_simple.lua @@ -9,6 +9,7 @@ yl_speak_up.trade_fail_fs = "size[6,2]".. -- possible inputs: -- fields.edit_trade_simple go on to showing the add_trade_simple formspec -- fields.abort_trade_simple, ESC, depends on context +-- fields.delete_trade_simple delete this trade -- fields.finished_trading -- if in edit mode: go back to edit options dialog -- if traded at least once: go on to the target dialog @@ -29,6 +30,32 @@ yl_speak_up.input_do_trade_simple = function(player, formname, fields) return end + -- delete a trade; this can be done here only if.. + -- * it is a trade from the trade list (not an effect of a dialog option) + -- * the player has the necessary privs + -- This option is available without having to enter edit mode first. + if(fields.delete_trade_simple + and yl_speak_up.may_edit_npc(player, trade.n_id)) then + -- get the necessary dialog data + local dialog = yl_speak_up.speak_to[pname].dialog + if(dialog and dialog.trades and trade.trade_id + and dialog.trades[ trade.trade_id ] and + not(dialog.trades[ trade.trade_id ].d_id)) then + -- log the change + yl_speak_up.log_change(pname, n_id, + "Trade: Deleted offer "..tostring(trade.trade_id)..".") + -- delete this particular trade + dialog.trades[ trade.trade_id ] = nil + -- TODO: save dialog + -- we are done with this trade + yl_speak_up.trade[pname] = nil + end + -- go back showing the trade list (since we deleted this trade) + minetest.show_formspec(pname, "yl_speak_up:trade_list", + yl_speak_up.get_fs_trade_list(player)) + return + end + -- can the player edit this trade? if(fields.edit_trade_simple and (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id @@ -216,7 +243,7 @@ yl_speak_up.input_add_trade_simple = function(player, formname, fields) -- record this as a change table.insert(yl_speak_up.npc_was_changed[ n_id ], "Trade: Deleted offer "..tostring(trade.trade_id)..".") - -- delete this particular trade and update the IDs in the array + -- delete this particular trade dialog.trades[ trade.trade_id ] = nil elseif(trade.r_id) then -- record this as a change @@ -374,7 +401,8 @@ yl_speak_up.get_fs_trade_simple = function(player, trade_id) trade_done = 0, -- we need to know which option this is target_dialog = d_id, - trade_is_trade_list = true + trade_is_trade_list = true, + trade_id = trade_id } if(dialog.trades[ trade_id ]) then trade.player_gives = dialog.trades[ trade_id ].pay[1] @@ -433,16 +461,18 @@ yl_speak_up.get_fs_trade_simple = function(player, trade_id) local npc_inv = minetest.get_inventory({type="detached", name="yl_speak_up_npc_"..tostring(trade.n_id)}) -- show edit button for the owner if in edit_mode - if(yl_speak_up.may_edit_npc(player, trade.n_id) - and (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id)) then + if(yl_speak_up.may_edit_npc(player, trade.n_id)) then -- for trades as part of the results/effects: allow edit - if(not(trade.trade_is_trade_list)) then + if(not(trade.trade_is_trade_list) + and (yl_speak_up.edit_mode[pname] == yl_speak_up.speak_to[pname].n_id)) then formspec = formspec.. "button[0.2,1.6;1.0,0.9;edit_trade_simple;Edit]".. "tooltip[edit_trade_simple;Edit this trade. You can do so only ".. "if you can edit the NPC as such (i.e. own it).]" -- for trades in trade list: allow delete (new trades can easily be added) - else + -- allow delete for trades in trade list even if not in edit mode + -- (entering edit mode for that would be too much work) + elseif(trade.trade_is_trade_list) then -- TODO: make this button work formspec = formspec.. "button[0.2,1.6;1.2,0.9;delete_trade_simple;Delete]".. @@ -515,6 +545,7 @@ yl_speak_up.get_fs_trade_simple = function(player, trade_id) "button[0.2,0.0;2.0,0.9;back_to_trade_list;Back to list]".. "tooltip[back_to_trade_list;Click here once you've traded enough with this ".. "NPC and want to get back to the trade list.]" + -- TODO: offer button to show the edit options dialog if suitable end return formspec..