starlit  Artifact [4840721039]

Artifact 484072103969448f740abd7dc7011afc29598bd53095ea8ee7ebc3f41af7dda8:


local lib = starlit.mod.lib


do -- chemlamp
	local burnTime = 60*60
	local maxBright = 12
	local stages = maxBright
	local stageTimeout = burnTime / stages
	local function chemLampID(n)
		if n == stages then return 'starlit_tech:chem_lamp' end
		return string.format('starlit_tech:chem_lamp_%s',n)
	end
	local fab = starlit.type.fab {
		element = { carbon = 8, magnesium = 2 };
		cost = { power = 100 };
		flag = { print = true };
		time = { print = 5 };
	};
	for i = stages, 0, -1 do
		minetest.register_node(chemLampID(i), {
			short_description = 'Chem Lamp';
			description = starlit.ui.tooltip {
				title = 'Chem Lamp';
				desc = "A simple carbon-frame chemical light source powered by ambient oxygen. Cheap, quick to print, and biodedragable, without any need for an electric grid or complex power storage mechanism. However, the light only lasts a few days, after which the lamp must be recycled or discarded.";
				color = lib.color(1,.4,.1);
				props = {
					{title = 'Burn Remaining', desc=lib.math.timespec(stageTimeout * i), affinity=i > 4 and 'good' or 'bad'};
					{title = 'Mass', desc='10g', affinity='info'};
				};
			};
			drawtype = 'nodebox';
			groups = {
				object = 1;
				attached_node = 1;
			};
			node_box = {
				type = 'fixed';
				fixed = {
					-.4, -.5, -.20;
					 .4, -.3,  .20;
				};
			};
			tiles = {
				lib.image 'starlit-tech-lamp-glow.png'
					:fade(1 - i/stages)
					:blit(lib.image 'starlit-tech-lamp.png')
				:render();
			};
			paramtype = 'light';
			paramtype2 = 'wallmounted';
			wallmounted_rotate_vertical = true;
			light_source = math.floor(lib.math.lerp(i/stages, 0, maxBright));
			on_construct = i ~= 0 and function(pos)
				local t = minetest.get_node_timer(pos)
				t:start(stageTimeout)
			end or nil;
			on_timer = i ~= 0 and function(pos)
				local me = minetest.get_node(pos)
				minetest.swap_node(pos, {name=chemLampID(i-1), param2=me.param2})
				return i > 1
			end or nil;
			_starlit = {
				mass = 10;
				reverseEngineer = {
					complexity = 1;
					sw = 'starlit_tech:schematic_chem_lamp';
				};
				recover = starlit.type.fab {
					element = {
						carbon = 8;
						magnesium = math.floor(lib.math.lerp(i/stages, 0, 2));
					};
					time = {
						shred = .5;
						shredPower = 2;
					};
				};

			};
		})
	end
	starlit.item.sw.link('starlit_tech:schematic_chem_lamp', {
		name = 'Chem Lamp Schematic';
		kind = 'schematic';
		input = fab;
		output = chemLampID(stages);
		size = 32e6;
		cost = {
			cycles = 8e9;
			ram = 16e6;
		};
		rarity = 1;
	})
end


minetest.register_node('starlit_tech:crate', {
	short_description = 'Crate';
	description = starlit.ui.tooltip {
		title = 'Crate';
		desc = 'A sturdy but lightweight storage crate woven from graphene.';
		props = { {title='Mass', affinity='info', desc='100g'} };
	};
	drawtype = 'nodebox';
	node_box = {
		type = 'fixed';
		fixed = {
			 .4,  .2,  .4;
			-.4, -.5, -.2;
		};
	};
	groups = {
		object = 3;
		attached_node = 3;
	};
	paramtype2 = 'facedir';
	tiles = {
		'starlit-tech-crate-top.png';
		'starlit-tech-crate-bottom.png';

		'starlit-tech-crate-side.png^[transformFX';
		'starlit-tech-crate-side.png';

		'starlit-tech-crate-back.png';
		'starlit-tech-crate-front.png';
	};
	_starlit = {
		mass = 100;
		reverseEngineer = {
			complexity = 1;
			sw = 'starlit_tech:schematic_crate';
		};
		recover = starlit.type.fab {
			element = { carbon = 100; };
			time = {
				shred = 1;
				shredPower = 3;
			};
		};
	};
	on_construct = function(pos)
		local m = minetest.get_meta(pos)
		local inv = m:get_inventory()
		inv:set_size('starlit:contents', 12)
	end;
	on_rightclick = function(pos, node, luser)
		if not luser then return end
		local user = starlit.activeUsers[luser:get_player_name()]
		user:openUI('starlit:box', 'index', {
			inv={
				{id = 'starlit:contents', pos=pos};
			};
		})
	end;
})

starlit.item.sw.link('starlit_tech:schematic_crate', {
	name = 'Crate Schematic';
	kind = 'schematic';
	input = starlit.type.fab {
		element = { carbon = 100; };
		flag = {print = true};
		time = {print = 25};
		cost = {power = 250};
	};
	output = 'starlit_tech:crate';
	size = 48e6;
	cost = {
		cycles = 12e9;
		ram = 16e6;
	};
	rarity = 1;
})