sorcery  astrolabe.lua at tip

File astrolabe.lua from the latest check-in


local calendar_style_list = function()
	local k = sorcery.lib.tbl.keys(sorcery.data.calendar.styles)
	table.sort(k)
	local r = {}
	for i,v in ipairs(k) do
		r[i] = {
			id = k[i];
			name = sorcery.data.calendar.styles[v].name;
		}
	end
	return r
end
local astrolabe_formspec = function(pos)
	local m = minetest.get_meta(pos)
	local i = m:get_inventory()
	local datestamp = minetest.get_day_count()
	local date = sorcery.calendar.date(datestamp)
	local strd = sorcery.calendar.stars(datestamp)
	local style = m:get_string('datestyle')
	if style == '' then style = sorcery.data.calendar.default end
	local fdate = string.format('<global halign=center valign=middle size=20><b>%s</b>\n%s',
		sorcery.calendar.shortdate(datestamp,style),
		sorcery.calendar.longdate(datestamp,style))
	sstr=string.format('<global halign=center valign=middle><style size=20>Sign of the %s</style>\n<i>Stellar cycle %u</i>',strd.sign.patron,strd.cycle)
	local lphase = sorcery.calendar.contmatch(sorcery.calendar.moon_phases,date.lunar_phase)
	local menu
	local mi = calendar_style_list()
	local activestyle = 1
	local getphaseimg = function(body,fac)
		if fac >= 1 then fac = 0 end
		return 'sorcery_'..body..'_phases.png^[verticalframe:19:' .. tostring(math.floor(fac * 20))
	end
	local planetphase = getphaseimg('planet',minetest.get_timeofday())
	local ltime = '<global halign=center size=15>' .. sorcery.calendar.contmatch(sorcery.calendar.timesofday,minetest.get_timeofday()+0.1)
	local moonphase = getphaseimg('moon',date.lunar_phase)
	local moonlabel = string.format('<global halign=center size=15>%s Moon', lphase)
	for i,s in ipairs(mi) do
		if s.id == style then activestyle = i end
		local esc = minetest.formspec_escape(s.name)
		if menu
			then menu = menu .. ',' .. esc
			else menu = esc
		end
	end
	m:set_string('formspec', string.format([[
		formspec_version[3] size[14,4.25]
		box[0.25,0.25;3.75,3.75;#000000FF]
		hypertext[0.25,2.75;3.75,1;;%s]
		dropdown[4.1,0.25;5.1;style;%s;%u]

		box[4.1,1.5;2.50,2.50;#000000FF]
		image[4.1,1.5;2.50,2.50;%s]
		hypertext[4.1,3.50;2.50,1;;%s]

		box[6.7,1.5;2.50,2.50;#000000FF]
		image[6.7,1.5;2.50,2.50;%s]
		hypertext[6.7,3.50;2.50,1;;%s]

		hypertext[9.60,1.5;4.15,2.5;;%s]

	]],
		minetest.formspec_escape(sstr),
		menu, activestyle,
		moonphase, minetest.formspec_escape(moonlabel),
		planetphase, minetest.formspec_escape(ltime),
		minetest.formspec_escape(fdate)))
end
local albox = {
	type = 'fixed';
	fixed = {
		-0.43,-0.5,-0.43;
		 0.43, 0.35, 0.43;
	};
}
minetest.register_node('sorcery:astrolabe',{
	description = 'Astrolabe';
	drawtype = 'mesh';
	mesh = 'sorcery-astrolabe.obj';
	groups = {
		cracky = 2, choppy = 2;
		dig_immediate = 2;
		sorcery_tech = 1;
		flammable = 1;
	};
	sunlight_propagates = true;
	paramtype = 'light';
	selection_box = albox, collision_box = albox;
	after_dig_node = sorcery.lib.node.purge_containers;
	tiles = {
		'default_steel_block.png';
		'default_bronze_block.png';
		'default_copper_block.png';
		'default_aspen_wood.png';
	};
	on_construct = function(pos)
		local m = minetest.get_meta(pos)
		local i = m:get_inventory()
		m:set_string('infotext','Astrolabe')
		astrolabe_formspec(pos)
	end;
	on_rightclick = function(pos)
		astrolabe_formspec(pos)
	end;
	on_receive_fields = function(pos,name,fields)
		local m = minetest.get_meta(pos)
		local i = m:get_inventory()

		local csl = calendar_style_list()
		if fields.style then
			for _,s in pairs(csl) do
				if s.name == fields.style then
					m:set_string('datestyle',s.id)
					astrolabe_formspec(pos)
					break
				end
			end
		end
	end;
	_sorcery = {
		recipe = {
			note = 'Unravel the secrets of the stars';
		};
	};
})

local m = sorcery.data.metals
minetest.register_craft {
	output = 'sorcery:astrolabe';
	recipe = {
		{'sorcery:steel_screw','default:steel_ingot','sorcery:steel_screw'};
		{m.copper.parts.disc,m.brass.parts.block,m.copper.parts.disc};
		{'default:stick','sorcery:screw_steel','default:stick'};
	};
};