starlit  Artifact [de8d4eba0f]

Artifact de8d4eba0f04fc8f1463a53c0075d74cfb775981cae6edf00910c85d3d963b29:


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 = 4, magnesium = 1 };
		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;
})