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)
|
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user