Add defragmenting card piles to make dropping cards on a pile
to work in all situations.
This commit is contained in:
parent
72cbb4e96c
commit
c9f237f838
41
init.lua
41
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user