diff --git a/init.lua b/init.lua index 7efb498..1d89233 100644 --- a/init.lua +++ b/init.lua @@ -203,6 +203,41 @@ local function lighten_pile(pos) minetest.set_node(pos,node) 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 player_inv=minetest.get_inventory({type="player", name=sender:get_player_name()}) local meta=minetest.get_meta(pos) @@ -227,6 +262,8 @@ local function put_all_to_pile(pos,formname,fields,sender) end if pile_peek_first(pile_inv) == nil then darken_pile(pos) + else + defragment_pile(pos) end end @@ -244,6 +281,8 @@ local function draw_one_card(pos,formname,fields,sender) player_inv:add_item("main",stack) if pile_peek_first(pile_inv) == nil then darken_pile(pos) + else + defragment_pile(pos) end return true end @@ -268,6 +307,7 @@ local function shuffle_pile(pos,formname,fields,sender) for i=1,s,1 do pile_inv:set_stack("main",i,newpos[i]) end + defragment_pile(pos) end local function convert_pile(pos,nodename) @@ -288,6 +328,7 @@ local function convert_pile(pos,nodename) local stack=ItemStack(cards[i]) newinv:set_stack("main",i,stack) end + defragment_pile(pos) end local function draw_card(pos,formname,fields,sender)