Add Tetris Arcade
@ -1,100 +1,100 @@
|
|||||||
computer = { };
|
computer = { }
|
||||||
|
|
||||||
computer.register = function (name, def)
|
computer.register = function (name, def)
|
||||||
local nodename = name;
|
local nodename = name
|
||||||
if (name:sub(1, 1) == ":") then name = name:sub(2); end
|
if (name:sub(1, 1) == ":") then name = name:sub(2) end
|
||||||
local modname, basename = name:match("^([^:]+):(.*)");
|
local modname, basename = name:match("^([^:]+):(.*)")
|
||||||
local TEXPFX = modname.."_"..basename.."_";
|
local TEXPFX = modname.."_"..basename.."_"
|
||||||
local ONSTATE = modname..":"..basename;
|
local ONSTATE = modname..":"..basename
|
||||||
local OFFSTATE = modname..":"..basename.."_off";
|
local OFFSTATE = modname..":"..basename.."_off"
|
||||||
local def = def;
|
local def = def
|
||||||
minetest.register_node(ONSTATE, {
|
minetest.register_node(ONSTATE, {
|
||||||
drawtype = "nodebox";
|
drawtype = "nodebox",
|
||||||
paramtype = "light";
|
paramtype = "light",
|
||||||
paramtype2 = "facedir";
|
paramtype2 = "facedir",
|
||||||
description = def.description;
|
description = def.description,
|
||||||
groups = { snappy=2, choppy=2, oddly_breakable_by_hand=2 };
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
||||||
tiles = {
|
tiles = {
|
||||||
TEXPFX.."tp.png",
|
TEXPFX.."tp.png",
|
||||||
TEXPFX.."bt.png",
|
TEXPFX.."bt.png",
|
||||||
TEXPFX.."rt.png",
|
TEXPFX.."rt.png",
|
||||||
TEXPFX.."lt.png",
|
TEXPFX.."lt.png",
|
||||||
TEXPFX.."bk.png",
|
TEXPFX.."bk.png",
|
||||||
TEXPFX.."ft.png",
|
TEXPFX.."ft.png"
|
||||||
};
|
},
|
||||||
node_box = def.node_box;
|
node_box = def.node_box,
|
||||||
selection_box = def.node_box;
|
selection_box = def.node_box,
|
||||||
on_rightclick = function (pos, node, clicker, itemstack)
|
on_rightclick = function (pos, node, clicker, itemstack)
|
||||||
if (def.on_turn_off) then
|
if (def.on_turn_off) then
|
||||||
if (def.on_turn_off(pos, node, clicker, itemstack)) then return; end
|
if (def.on_turn_off(pos, node, clicker, itemstack)) then return end
|
||||||
end
|
end
|
||||||
node.name = OFFSTATE;
|
node.name = OFFSTATE
|
||||||
minetest.set_node(pos, node);
|
minetest.set_node(pos, node)
|
||||||
end;
|
end
|
||||||
});
|
})
|
||||||
minetest.register_node(OFFSTATE, {
|
minetest.register_node(OFFSTATE, {
|
||||||
drawtype = "nodebox";
|
drawtype = "nodebox",
|
||||||
paramtype = "light";
|
paramtype = "light",
|
||||||
paramtype2 = "facedir";
|
paramtype2 = "facedir",
|
||||||
groups = { snappy=2, choppy=2, oddly_breakable_by_hand=2,
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
|
||||||
not_in_creative_inventory=1 };
|
|
||||||
tiles = {
|
tiles = {
|
||||||
(TEXPFX.."tp"..(def.tiles_off.top and "_off" or "")..".png"),
|
(TEXPFX.."tp"..(def.tiles_off.top and "_off" or "")..".png"),
|
||||||
(TEXPFX.."bt"..(def.tiles_off.bottom and "_off" or "")..".png"),
|
(TEXPFX.."bt"..(def.tiles_off.bottom and "_off" or "")..".png"),
|
||||||
(TEXPFX.."rt"..(def.tiles_off.right and "_off" or "")..".png"),
|
(TEXPFX.."rt"..(def.tiles_off.right and "_off" or "")..".png"),
|
||||||
(TEXPFX.."lt"..(def.tiles_off.left and "_off" or "")..".png"),
|
(TEXPFX.."lt"..(def.tiles_off.left and "_off" or "")..".png"),
|
||||||
(TEXPFX.."bk"..(def.tiles_off.back and "_off" or "")..".png"),
|
(TEXPFX.."bk"..(def.tiles_off.back and "_off" or "")..".png"),
|
||||||
(TEXPFX.."ft"..(def.tiles_off.front and "_off" or "")..".png"),
|
(TEXPFX.."ft"..(def.tiles_off.front and "_off" or "")..".png")
|
||||||
};
|
},
|
||||||
node_box = def.node_box_off or def.node_box;
|
node_box = def.node_box_off or def.node_box,
|
||||||
selection_box = def.node_box_off or def.node_box;
|
selection_box = def.node_box_off or def.node_box,
|
||||||
on_rightclick = function (pos, node, clicker, itemstack)
|
on_rightclick = function (pos, node, clicker, itemstack)
|
||||||
if (def.on_turn_on) then
|
if (def.on_turn_on) then
|
||||||
if (def.on_turn_on(pos, node, clicker, itemstack)) then return; end
|
if (def.on_turn_on(pos, node, clicker, itemstack)) then return end
|
||||||
end
|
end
|
||||||
node.name = ONSTATE;
|
node.name = ONSTATE
|
||||||
minetest.set_node(pos, node);
|
minetest.set_node(pos, node)
|
||||||
end;
|
end,
|
||||||
drop = ONSTATE;
|
drop = ONSTATE
|
||||||
});
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
computer.register_handheld = function (name, def)
|
computer.register_handheld = function (name, def)
|
||||||
local nodename = name;
|
local nodename = name
|
||||||
if (name:sub(1, 1) == ":") then name = name:sub(2); end
|
if (name:sub(1, 1) == ":") then name = name:sub(2) end
|
||||||
local modname, basename = name:match("^([^:]+):(.*)");
|
local modname, basename = name:match("^([^:]+):(.*)")
|
||||||
local TEXPFX = modname.."_"..basename.."_inv";
|
local TEXPFX = modname.."_"..basename.."_inv"
|
||||||
local ONSTATE = modname..":"..basename;
|
local ONSTATE = modname..":"..basename
|
||||||
local OFFSTATE = modname..":"..basename.."_off";
|
local OFFSTATE = modname..":"..basename.."_off"
|
||||||
local on_use = def.on_use;
|
local on_use = def.on_use
|
||||||
minetest.register_craftitem(ONSTATE, {
|
minetest.register_craftitem(ONSTATE, {
|
||||||
description = def.description;
|
description = def.description,
|
||||||
inventory_image = TEXPFX..".png";
|
inventory_image = TEXPFX..".png",
|
||||||
wield_image = TEXPFX..".png";
|
wield_image = TEXPFX..".png"
|
||||||
});
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
computer.pixelnodebox = function (size, boxes)
|
computer.pixelnodebox = function (size, boxes)
|
||||||
local fixed = { };
|
local fixed = { }
|
||||||
local i, box;
|
local i, box
|
||||||
for i, box in ipairs(boxes) do
|
for i, box in ipairs(boxes) do
|
||||||
local x, y, z, w, h, l = unpack(box);
|
local x, y, z, w, h, l = unpack(box)
|
||||||
fixed[#fixed + 1] = {
|
fixed[#fixed + 1] = {
|
||||||
(x / size) - 0.5,
|
(x / size) - 0.5,
|
||||||
(y / size) - 0.5,
|
(y / size) - 0.5,
|
||||||
(z / size) - 0.5,
|
(z / size) - 0.5,
|
||||||
((x + w) / size) - 0.5,
|
((x + w) / size) - 0.5,
|
||||||
((y + h) / size) - 0.5,
|
((y + h) / size) - 0.5,
|
||||||
((z + l) / size) - 0.5,
|
((z + l) / size) - 0.5
|
||||||
};
|
}
|
||||||
end
|
end
|
||||||
return {
|
return {
|
||||||
type = "fixed";
|
type = "fixed",
|
||||||
fixed = fixed;
|
fixed = fixed
|
||||||
};
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
local MODPATH = minetest.get_modpath("computer");
|
local MODPATH = minetest.get_modpath("computer")
|
||||||
dofile(MODPATH.."/computers.lua");
|
dofile(MODPATH.."/computers.lua")
|
||||||
dofile(MODPATH.."/miscitems.lua");
|
dofile(MODPATH.."/miscitems.lua")
|
||||||
dofile(MODPATH.."/recipes.lua");
|
dofile(MODPATH.."/recipes.lua")
|
||||||
|
dofile(MODPATH.."/tetris.lua")
|
||||||
|
34
computer/models/tetris_arcade.obj
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Blender v2.72 (sub 0) OBJ File: ''
|
||||||
|
# www.blender.org
|
||||||
|
mtllib vending_machine.mtl
|
||||||
|
o Cube
|
||||||
|
v 0.499998 -0.499998 -0.499998
|
||||||
|
v 0.499998 -0.499998 0.499998
|
||||||
|
v -0.499998 -0.499998 0.499998
|
||||||
|
v -0.499998 -0.499998 -0.499998
|
||||||
|
v 0.499998 1.499994 -0.499998
|
||||||
|
v 0.499998 1.499994 0.499998
|
||||||
|
v -0.499998 1.499994 0.499998
|
||||||
|
v -0.499998 1.499994 -0.499998
|
||||||
|
vt 0.250050 0.250050
|
||||||
|
vt 0.000100 0.250050
|
||||||
|
vt 0.000100 0.000100
|
||||||
|
vt 0.250050 0.000100
|
||||||
|
vt 0.250050 0.749950
|
||||||
|
vt 0.250050 0.999900
|
||||||
|
vt 0.000100 0.999900
|
||||||
|
vt 0.000100 0.749950
|
||||||
|
vt 0.999900 0.250049
|
||||||
|
vt 0.999900 0.749949
|
||||||
|
vt 0.749950 0.749950
|
||||||
|
vt 0.749950 0.250050
|
||||||
|
vt 0.500000 0.749950
|
||||||
|
vt 0.500000 0.250050
|
||||||
|
usemtl Material
|
||||||
|
s off
|
||||||
|
f 1/1 2/2 3/3 4/4
|
||||||
|
f 5/5 8/6 7/7 6/8
|
||||||
|
f 1/1 5/5 6/8 2/2
|
||||||
|
f 2/9 6/10 7/11 3/12
|
||||||
|
f 3/12 7/11 8/13 4/14
|
||||||
|
f 5/5 1/1 4/14 8/13
|
@ -3,132 +3,141 @@
|
|||||||
-- License is WTFPL (see README.txt).
|
-- License is WTFPL (see README.txt).
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:shefriendSOO";
|
output = "computer:shefriendSOO",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:glass", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:glass", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:wood", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:wood", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:slaystation";
|
output = "computer:slaystation",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:wood", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:wood", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:vanio";
|
output = "computer:vanio",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "", "", },
|
{ "homedecor:plastic_sheeting", "", "" },
|
||||||
{ "default:glass", "", "" },
|
{ "default:glass", "", "" },
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:specter";
|
output = "computer:specter",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "", "", "homedecor:plastic_sheeting", },
|
{ "", "", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:slaystation2";
|
output = "computer:slaystation2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:admiral64";
|
output = "computer:admiral64",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "default:wood", "default:wood", "default:wood", },
|
{ "default:wood", "default:wood", "default:wood" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:admiral128";
|
output = "computer:admiral128",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot", },
|
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:wee";
|
output = "computer:wee",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:copper_ingot", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:copper_ingot", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:piepad";
|
output = "computer:piepad",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:glass", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:glass", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
--new stuff
|
--new stuff
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:monitor";
|
output = "computer:monitor",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "default:glass","", },
|
{ "homedecor:plastic_sheeting", "default:glass","" },
|
||||||
{ "homedecor:plastic_sheeting", "default:glass","", },
|
{ "homedecor:plastic_sheeting", "default:glass","" },
|
||||||
{ "homedecor:plastic_sheeting", "default:mese_crystal_fragment", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:mese_crystal_fragment", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:router";
|
output = "computer:router",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "default:steel_ingot","","", },
|
{ "default:steel_ingot","","" },
|
||||||
{ "default:steel_ingot" ,"homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "default:steel_ingot" ,"homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
|
||||||
{ "default:mese_crystal_fragment","homedecor:plastic_sheeting", "homedecor:plastic_sheeting", },
|
{ "default:mese_crystal_fragment","homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:tower";
|
output = "computer:tower",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:mese_crystal", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:mese_crystal", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:printer";
|
output = "computer:printer",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "default:steel_ingot","", },
|
{ "homedecor:plastic_sheeting", "default:steel_ingot","" },
|
||||||
{ "homedecor:plastic_sheeting", "default:mese_crystal", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:mese_crystal", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "default:coal_lump", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:coal_lump", "homedecor:plastic_sheeting" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:printer";
|
output = "computer:printer",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "homedecor:plastic_sheeting", "default:steel_ingot","", },
|
{ "homedecor:plastic_sheeting", "default:steel_ingot","" },
|
||||||
{ "homedecor:plastic_sheeting", "default:mese_crystal", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "default:mese_crystal", "homedecor:plastic_sheeting" },
|
||||||
{ "homedecor:plastic_sheeting", "dye:black", "homedecor:plastic_sheeting", },
|
{ "homedecor:plastic_sheeting", "dye:black", "homedecor:plastic_sheeting", }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "computer:server";
|
output = "computer:server",
|
||||||
recipe = {
|
recipe = {
|
||||||
{ "computer:tower", "computer:tower", "computer:tower", },
|
{ "computer:tower", "computer:tower", "computer:tower", },
|
||||||
{ "computer:tower", "computer:tower", "computer:tower", },
|
{ "computer:tower", "computer:tower", "computer:tower" },
|
||||||
{ "computer:tower", "computer:tower", "computer:tower", },
|
{ "computer:tower", "computer:tower", "computer:tower" }
|
||||||
};
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "computer:tetris_arcade",
|
||||||
|
recipe = {
|
||||||
|
{ "homedecor:plastic_sheeting", "homedecor:power_crystal", "homedecor:plastic_sheeting", },
|
||||||
|
{ "dye:black", "default:glass", "dye:black" },
|
||||||
|
{ "homedecor:plastic_sheeting", "homedecor:power_crystal", "homedecor:plastic_sheeting" }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
282
computer/tetris.lua
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
local shapes = {
|
||||||
|
{ { x = {0, 1, 0, 1}, y = {0, 0, 1, 1} } },
|
||||||
|
|
||||||
|
{ { x = {1, 1, 1, 1}, y = {0, 1, 2, 3} },
|
||||||
|
{ x = {0, 1, 2, 3}, y = {1, 1, 1, 1} } },
|
||||||
|
|
||||||
|
{ { x = {0, 0, 1, 1}, y = {0, 1, 1, 2} },
|
||||||
|
{ x = {1, 2, 0, 1}, y = {0, 0, 1, 1} } },
|
||||||
|
|
||||||
|
{ { x = {1, 0, 1, 0}, y = {0, 1, 1, 2} },
|
||||||
|
{ x = {0, 1, 1, 2}, y = {0, 0, 1, 1} } },
|
||||||
|
|
||||||
|
{ { x = {1, 2, 1, 1}, y = {0, 0, 1, 2} },
|
||||||
|
{ x = {0, 1, 2, 2}, y = {1, 1, 1, 2} },
|
||||||
|
{ x = {1, 1, 0, 1}, y = {0, 1, 2, 2} },
|
||||||
|
{ x = {0, 0, 1, 2}, y = {0, 1, 1, 1} } },
|
||||||
|
|
||||||
|
{ { x = {1, 1, 1, 2}, y = {0, 1, 2, 2} },
|
||||||
|
{ x = {0, 1, 2, 0}, y = {1, 1, 1, 2} },
|
||||||
|
{ x = {0, 1, 1, 1}, y = {0, 0, 1, 2} },
|
||||||
|
{ x = {0, 1, 2, 2}, y = {1, 1, 1, 0} } },
|
||||||
|
|
||||||
|
{ { x = {1, 0, 1, 2}, y = {0, 1, 1, 1} },
|
||||||
|
{ x = {1, 1, 1, 2}, y = {0, 1, 2, 1} },
|
||||||
|
{ x = {0, 1, 2, 1}, y = {1, 1, 1, 2} },
|
||||||
|
{ x = {0, 1, 1, 1}, y = {1, 0, 1, 2} } } }
|
||||||
|
|
||||||
|
local colors = { "computer_cyan.png", "computer_magenta.png", "computer_red.png",
|
||||||
|
"computer_blue.png", "computer_green.png", "computer_orange.png", "computer_yellow.png" }
|
||||||
|
|
||||||
|
local background = "image[0,0;3.55,6.66;computer_black.png]"
|
||||||
|
local buttons = "button[3,4.5;0.6,0.6;left;◄]"
|
||||||
|
.."button[3.6,4.5;0.6,0.6;rotateleft;L]"
|
||||||
|
.."button[4.2,4.5;0.6,0.6;down;V]"
|
||||||
|
.."button[4.2,5.3;0.6,0.6;drop;▼]"
|
||||||
|
.."button[4.8,4.5;0.6,0.6;rotateright;R]"
|
||||||
|
.."button[5.4,4.5;0.6,0.6;right;►]"
|
||||||
|
.."button[3.5,3;2,2;new;New Game]"
|
||||||
|
|
||||||
|
local formsize = "size[5.9,5.7]"
|
||||||
|
local boardx, boardy = 0, 0
|
||||||
|
local sizex, sizey, size = 0.29, 0.29, 0.31
|
||||||
|
|
||||||
|
local comma = ","
|
||||||
|
local semi = ";"
|
||||||
|
local close = "]"
|
||||||
|
|
||||||
|
local concat = table.concat
|
||||||
|
local insert = table.insert
|
||||||
|
|
||||||
|
local draw_shape = function(id, x, y, rot, posx, posy)
|
||||||
|
local d = shapes[id][rot]
|
||||||
|
local scr = {}
|
||||||
|
local ins = #scr
|
||||||
|
|
||||||
|
for i=1,4 do
|
||||||
|
local tmp = { "image[",
|
||||||
|
(d.x[i]+x)*sizex+posx, comma,
|
||||||
|
(d.y[i]+y)*sizey+posy, semi,
|
||||||
|
size, comma, size, semi,
|
||||||
|
colors[id], close }
|
||||||
|
|
||||||
|
ins = ins + 1
|
||||||
|
scr[ins] = concat(tmp)
|
||||||
|
end
|
||||||
|
|
||||||
|
return concat(scr)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function step(pos, fields)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local t = minetest.deserialize(meta:get_string("tetris"))
|
||||||
|
|
||||||
|
local function new_game(pos)
|
||||||
|
local nex = math.random(7)
|
||||||
|
|
||||||
|
t = {
|
||||||
|
board = {},
|
||||||
|
boardstring = "",
|
||||||
|
previewstring = draw_shape(nex, 0, 0, 1, 4, 1),
|
||||||
|
score = 0,
|
||||||
|
cur = math.random(7),
|
||||||
|
nex = nex,
|
||||||
|
x=4, y=0, rot=1
|
||||||
|
}
|
||||||
|
|
||||||
|
local timer = minetest.get_node_timer(pos)
|
||||||
|
timer:set(0.3, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_boardstring()
|
||||||
|
local scr = {}
|
||||||
|
local ins = #scr
|
||||||
|
|
||||||
|
for i, line in pairs(t.board) do
|
||||||
|
for _, tile in pairs(line) do
|
||||||
|
local tmp = { "image[",
|
||||||
|
tile[1]*sizex+boardx, comma,
|
||||||
|
i*sizey+boardy, semi,
|
||||||
|
size, comma, size, semi,
|
||||||
|
colors[tile[2]], close }
|
||||||
|
|
||||||
|
ins = ins + 1
|
||||||
|
scr[ins] = concat(tmp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
t.boardstring = concat(scr)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function add()
|
||||||
|
local d = shapes[t.cur][t.rot]
|
||||||
|
|
||||||
|
for i=1,4 do
|
||||||
|
local l = d.y[i] + t.y
|
||||||
|
if not t.board[l] then t.board[l] = {} end
|
||||||
|
insert(t.board[l], {d.x[i] + t.x, t.cur})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function scroll(l)
|
||||||
|
for i=l, 1, -1 do
|
||||||
|
t.board[i] = t.board[i-1] or {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function check_lines()
|
||||||
|
for i, line in pairs(t.board) do
|
||||||
|
if #line >= 10 then
|
||||||
|
scroll(i)
|
||||||
|
t.score = t.score + 20
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function check_position(x, y, rot)
|
||||||
|
local d = shapes[t.cur][rot]
|
||||||
|
|
||||||
|
for i=1,4 do
|
||||||
|
local cx, cy = d.x[i]+x, d.y[i]+y
|
||||||
|
|
||||||
|
if cx < 0 or cx > 9 or cy < 0 or cy > 19 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, tile in pairs(t.board[ cy ] or {}) do
|
||||||
|
if tile[1] == cx then return false end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function stuck()
|
||||||
|
if check_position(t.x, t.y+1, t.rot) then return false end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tick()
|
||||||
|
if stuck() then
|
||||||
|
if t.y <= 0 then
|
||||||
|
return false end
|
||||||
|
add()
|
||||||
|
check_lines()
|
||||||
|
update_boardstring()
|
||||||
|
t.cur, t.nex = t.nex, math.random(7)
|
||||||
|
t.x, t.y, t.rot = 4, 0, 1
|
||||||
|
t.previewstring = draw_shape(t.nex, 0, 0, 1, 4.1, 0.6)
|
||||||
|
else
|
||||||
|
t.y = t.y + 1
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function move(dx, dy)
|
||||||
|
local newx, newy = t.x+dx, t.y+dy
|
||||||
|
if not check_position(newx, newy, t.rot) then return end
|
||||||
|
t.x, t.y = newx, newy
|
||||||
|
end
|
||||||
|
|
||||||
|
local function rotate(dr)
|
||||||
|
local no = #(shapes[t.cur])
|
||||||
|
local newrot = (t.rot+dr) % no
|
||||||
|
|
||||||
|
if newrot<1 then newrot = newrot+no end
|
||||||
|
if not check_position(t.x, t.y, newrot) then return end
|
||||||
|
t.rot = newrot
|
||||||
|
end
|
||||||
|
|
||||||
|
local function key()
|
||||||
|
if fields.left then
|
||||||
|
move(-1, 0)
|
||||||
|
end
|
||||||
|
if fields.rotateleft then
|
||||||
|
rotate(-1)
|
||||||
|
end
|
||||||
|
if fields.down then
|
||||||
|
t.score = t.score + 1
|
||||||
|
move(0, 1)
|
||||||
|
end
|
||||||
|
if fields.drop then
|
||||||
|
while not stuck() do
|
||||||
|
t.score = t.score + 2
|
||||||
|
move(0, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if fields.rotateright then
|
||||||
|
rotate(1)
|
||||||
|
end
|
||||||
|
if fields.right then
|
||||||
|
move(1, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local run = true
|
||||||
|
|
||||||
|
if fields then
|
||||||
|
if fields.new then
|
||||||
|
new_game(pos)
|
||||||
|
else
|
||||||
|
key(fields)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
run = tick()
|
||||||
|
end
|
||||||
|
|
||||||
|
if t ~= nil then
|
||||||
|
local scr = { formsize, background,
|
||||||
|
t.boardstring, t.previewstring,
|
||||||
|
draw_shape(t.cur, t.x, t.y, t.rot, boardx, boardy),
|
||||||
|
"label[3.8,0.1;Next...]label[3.8,2.7;Score: ",
|
||||||
|
t.score, close, buttons }
|
||||||
|
|
||||||
|
|
||||||
|
meta:set_string("formspec", concat(scr)
|
||||||
|
..default.gui_bg..default.gui_bg_img..default.gui_slots)
|
||||||
|
meta:set_string("tetris", minetest.serialize(t))
|
||||||
|
end
|
||||||
|
|
||||||
|
return run
|
||||||
|
end
|
||||||
|
|
||||||
|
local arcade = {
|
||||||
|
description="Tetris Arcade",
|
||||||
|
drawtype = "mesh",
|
||||||
|
mesh = "tetris_arcade.obj",
|
||||||
|
tiles = {"tetris_arcade.png"},
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {snappy=3},
|
||||||
|
selection_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}
|
||||||
|
},
|
||||||
|
collision_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}
|
||||||
|
},
|
||||||
|
on_construct = function(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_string("formspec", formsize.."button[2,2.5;2,2;new;New Game]"
|
||||||
|
..default.gui_bg..default.gui_bg_img..default.gui_slots)
|
||||||
|
end,
|
||||||
|
on_timer = function(pos)
|
||||||
|
return step(pos, nil)
|
||||||
|
end,
|
||||||
|
on_receive_fields = function(pos, formanme, fields, sender)
|
||||||
|
step(pos, fields)
|
||||||
|
end,
|
||||||
|
on_place = function(itemstack, placer, pointed_thing)
|
||||||
|
local pos = pointed_thing.above
|
||||||
|
if minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name ~= "air" then
|
||||||
|
minetest.chat_send_player(placer:get_player_name(), "No room for place the Arcade!")
|
||||||
|
return end
|
||||||
|
local dir = placer:get_look_dir()
|
||||||
|
local node = {name="computer:tetris_arcade", param1=0, param2 = minetest.dir_to_facedir(dir)}
|
||||||
|
minetest.set_node(pos, node)
|
||||||
|
itemstack:take_item()
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.register_node("computer:tetris_arcade", arcade)
|
BIN
computer/textures/computer_black.png
Normal file
After Width: | Height: | Size: 82 B |
BIN
computer/textures/computer_blue.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
computer/textures/computer_cyan.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
computer/textures/computer_green.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
computer/textures/computer_magenta.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
computer/textures/computer_orange.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
computer/textures/computer_red.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
computer/textures/computer_yellow.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
computer/textures/tetris_arcade.png
Normal file
After Width: | Height: | Size: 9.1 KiB |