Add defragmenting card piles to make dropping cards on a pile

to work in all situations.
This commit is contained in:
Mikko Tuumanen 2020-06-10 20:43:17 +03:00
parent 72cbb4e96c
commit c9f237f838

View File

@ -203,6 +203,41 @@ local function lighten_pile(pos)
minetest.set_node(pos,node) minetest.set_node(pos,node)
end end
local function defragment_pile(pos)
local meta=minetest.get_meta(pos)
local pile_inv=meta:get_inventory()
local s=pile_inv:get_size("main")
local search_start=s-1
for i=s,1,-1 do
minetest.log("defrag:"..i)
local stack=pile_inv:get_stack("main",i)
if stack:is_empty() then
for j=search_start,1,-1 do
local st=pile_inv:get_stack("main",j)
if st:is_empty() then
minetest.log("defrag: empty stack i="..i.." j="..j)
else
pile_inv:set_stack("main",i,st)
pile_inv:set_stack("main",j,ItemStack())
minetest.log("defrag:move"..j.."->"..i)
search_start=j-1
if search_start==0 then
minetest.log("defrag:exit at i="..i)
return
end
break
end
if j==1 then
minetest.log("defrag:exit at j=1")
return
end
end
elseif search_start > i-1 then
search_start=i-1
end
end
end
local function put_all_to_pile(pos,formname,fields,sender) local function put_all_to_pile(pos,formname,fields,sender)
local player_inv=minetest.get_inventory({type="player", name=sender:get_player_name()}) local player_inv=minetest.get_inventory({type="player", name=sender:get_player_name()})
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
@ -227,6 +262,8 @@ local function put_all_to_pile(pos,formname,fields,sender)
end end
if pile_peek_first(pile_inv) == nil then if pile_peek_first(pile_inv) == nil then
darken_pile(pos) darken_pile(pos)
else
defragment_pile(pos)
end end
end end
@ -244,6 +281,8 @@ local function draw_one_card(pos,formname,fields,sender)
player_inv:add_item("main",stack) player_inv:add_item("main",stack)
if pile_peek_first(pile_inv) == nil then if pile_peek_first(pile_inv) == nil then
darken_pile(pos) darken_pile(pos)
else
defragment_pile(pos)
end end
return true return true
end end
@ -268,6 +307,7 @@ local function shuffle_pile(pos,formname,fields,sender)
for i=1,s,1 do for i=1,s,1 do
pile_inv:set_stack("main",i,newpos[i]) pile_inv:set_stack("main",i,newpos[i])
end end
defragment_pile(pos)
end end
local function convert_pile(pos,nodename) local function convert_pile(pos,nodename)
@ -288,6 +328,7 @@ local function convert_pile(pos,nodename)
local stack=ItemStack(cards[i]) local stack=ItemStack(cards[i])
newinv:set_stack("main",i,stack) newinv:set_stack("main",i,stack)
end end
defragment_pile(pos)
end end
local function draw_card(pos,formname,fields,sender) local function draw_card(pos,formname,fields,sender)