forked from Sokomine/yl_speak_up
139 lines
4.5 KiB
Lua
139 lines
4.5 KiB
Lua
-- show a list of all trades
|
|
|
|
|
|
-- the player is accessing the trade list
|
|
yl_speak_up.input_trade_list = function(player, formname, fields)
|
|
local pname = player:get_player_name()
|
|
local d_id = yl_speak_up.speak_to[pname].d_id
|
|
local n_id = yl_speak_up.speak_to[pname].n_id
|
|
|
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
|
|
|
if(not(dialog.trades)) then
|
|
dialog.trades = {}
|
|
end
|
|
|
|
-- the player wants to add a new trade
|
|
if(fields.trade_list_add_trade) then
|
|
-- show the trade config dialog for a new trade
|
|
minetest.show_formspec(pname, "yl_speak_up:add_trade_simple",
|
|
yl_speak_up.get_fs_trade_simple(player, "new"))
|
|
return
|
|
end
|
|
|
|
-- go back to the main dialog
|
|
if(fields.finished_trading) then
|
|
minetest.show_formspec(pname, "yl_speak_up:talk",
|
|
yl_speak_up.get_fs_talkdialog(player, n_id, d_id))
|
|
return
|
|
end
|
|
|
|
-- normal mode: the player wants to see a particular trade
|
|
for k,v in pairs(dialog.trades) do
|
|
if(fields[ k ]) then
|
|
minetest.show_formspec(pname, "yl_speak_up:do_trade_simple",
|
|
yl_speak_up.get_fs_trade_simple(player, k))
|
|
return
|
|
end
|
|
end
|
|
|
|
-- show the inventory of the NPC
|
|
if(fields.show_inventory) then
|
|
minetest.show_formspec(pname, "yl_speak_up:inventory",
|
|
yl_speak_up.get_fs_inventory(player))
|
|
return
|
|
end
|
|
-- TODO: and otherwise?
|
|
end
|
|
|
|
|
|
-- show a list of all trades the NPC has to offer
|
|
yl_speak_up.get_fs_trade_list = function(player)
|
|
if(not(player)) then
|
|
return ""
|
|
end
|
|
local pname = player:get_player_name()
|
|
-- which NPC is the player talking to?
|
|
local n_id = yl_speak_up.speak_to[pname].n_id
|
|
local dialog = yl_speak_up.speak_to[pname].dialog
|
|
-- do we have all the necessary data?
|
|
if(not(n_id) or not(dialog.n_npc)) then
|
|
return "size[6,2]"..
|
|
"label[0.2,0.5;Ups! This NPC lacks ID or name.]"..
|
|
"button_exit[2,1.5;1,0.9;exit;Exit]"
|
|
|
|
end
|
|
|
|
-- make sure the NPC has that table defined
|
|
if(not(dialog.trades)) then
|
|
dialog.trades = {}
|
|
end
|
|
|
|
yl_speak_up.load_npc_inventory(n_id)
|
|
local npc_inv = minetest.get_inventory({type="detached", name="yl_speak_up_npc_"..tostring(n_id)})
|
|
|
|
local formspec = {}
|
|
-- arrange the offers in yl_speak_up.trade_max_cols columns horizontally
|
|
-- and yl_speak_up.trade_max_rows row vertically
|
|
local row = 0
|
|
local col = 0
|
|
local anz_trades = 0
|
|
|
|
-- TODO: handle multiple pages?
|
|
for k, v in pairs(dialog.trades) do
|
|
if(col < yl_speak_up.trade_max_cols
|
|
and v.pay and v.pay[1] and v.pay[1] ~= "" and v.buy and v.buy[1] and v.buy[1] ~= "") then
|
|
local pay_stack = ItemStack(v.pay[1])
|
|
local buy_stack = ItemStack(v.buy[1])
|
|
-- do not show trades with nonexistant items
|
|
if( not(minetest.registered_items[ pay_stack:get_name() ])
|
|
or not(minetest.registered_items[ buy_stack:get_name() ])) then
|
|
break
|
|
end
|
|
|
|
anz_trades = anz_trades + 1
|
|
local kstr = tostring(minetest.formspec_escape(k))
|
|
table.insert(formspec,
|
|
"item_image_button["..tostring(1+(col*4))..","..tostring(1+row)..";1,1;"..
|
|
tostring(v.pay[1])..";"..kstr..";]"..
|
|
"image_button["..tostring(1.8+(col*4))..","..tostring(1+row)..";1,1;"..
|
|
"gui_furnace_arrow_bg.png^[transformR270;"..kstr..";]"..
|
|
"item_image_button["..tostring(2.6+(col*4))..","..tostring(1+row)..";1,1;"..
|
|
tostring(v.buy[1])..";"..kstr..";]")
|
|
row = row + 1
|
|
if(row > yl_speak_up.trade_max_rows) then
|
|
row = 0
|
|
col = col + 1
|
|
end
|
|
if(not(npc_inv:contains_item("npc_main", buy_stack))) then
|
|
table.insert(formspec,
|
|
"label["..tostring(1.7+(col*4))..","..tostring(0.2+row)..";Sold out]")
|
|
end
|
|
end
|
|
end
|
|
|
|
-- if there are no trades, at least print a hint that there could be some here
|
|
-- (a mostly empty formspec looks too boring and could irritate players)
|
|
if(anz_trades == 0) then
|
|
table.insert(formspec,
|
|
"label[1,1;Sorry. There are currently no offers available.]")
|
|
end
|
|
|
|
-- button "add trade" for those who can edit the NPC (entering edit mode is not required)
|
|
-- also add a quick way to access the inventory of the npc
|
|
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]"..
|
|
"button["..tostring(yl_speak_up.trade_max_cols * 4 - 4.2)..
|
|
",-0.5;4.0,0.9;show_inventory;Show inventory of NPC]")
|
|
end
|
|
|
|
return "size["..
|
|
tostring(yl_speak_up.trade_max_cols * 4)..","..
|
|
tostring(yl_speak_up.trade_max_rows + 2).."]"..
|
|
"button[0.2,0.0;2.0,0.9;finished_trading;Back to talk]"..
|
|
"label[3.0,0.2;"..tostring(dialog.n_npc).." offers you these trades:]"..
|
|
table.concat(formspec, "")
|
|
end
|