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 |