118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
...
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
...
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
...
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
...
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
...
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
...
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
|
return function(stack, ...)
local function fail()
error(string.format('object %q is not a %s', stack:get_name(), ty))
end
if not stack or stack:is_empty() then fail() end
if minetest.get_item_group(stack:get_name(), ty) == 0 then fail() end
return fn(stack,
stack:get_definition()._starlit[ty],
stack:get_meta(), ...)
end
end
................................................................................
totalPower = E.battery.charge;
initialPower = E.battery.capacity;
dischargeRate = E.battery.dischargeRate;
wasteHeat = function() return 0 end;
};
starlit.item.battery.foreach('starlit_electronics:battery-gen', {}, function(id, def)
minetest.register_tool(id, {
short_description = def.name;
groups = { battery = 1; dynamo = 1; electronic = 1; };
inventory_image = def.img or 'starlit-item-battery.png';
description = starlit.ui.tooltip {
title = def.name;
desc = def.desc;
color = lib.color(0,.2,1);
................................................................................
-----------
-- chips --
-----------
E.sw = {}
function E.sw.findSchematicFor(item)
local id = ItemStack(item):get_name()
local fm = minetest.registered_items[id]._starlit
if not (fm and fm.reverseEngineer) then return nil end
local id = fm.reverseEngineer.sw
return id, starlit.item.sw.db[id]
end
E.chip = { file = {} }
do local T,G = lib.marshal.t, lib.marshal.g
................................................................................
elseif file.kind == 'note' then
local sz = 0x10 + #file.body.author
for _, e in pairs(file.body.entries) do
sz = sz + #e.title + #e.body + 0x10 -- header overhead
end
return sz
elseif file.kind == 'research' then
local re = assert(minetest.registered_items[file.body.itemId]._starlit.reverseEngineer)
return starlit.item.sw.db[re.sw].size * file.body.progress
elseif file.kind == 'sw' then
return starlit.item.sw.db[file.body.pgmId].size
elseif file.kind == 'genome' then
return 0 -- TODO
end
end
................................................................................
end
function E.chip.update(chip)
chip:get_meta():set_string('description', E.chip.describe(chip))
end
starlit.item.chip.foreach('starlit_electronics:chip-gen', {}, function(id, def)
minetest.register_craftitem(id, {
short_description = def.name;
description = E.chip.describe(def, true);
inventory_image = def.img or 'starlit-item-chip.png';
groups = {chip = 1};
_starlit = {
fab = def.fab;
chip = def;
................................................................................
compute = {name = 'Compute Chip', clockRate = 4e9, flash = 24e6, ram = 64e9, powerEfficiency = 1e9, size = 4};
data = {name = 'Data Chip', clockRate = 128e3, flash = 2e12, ram = 32e3, powerEfficiency = 1e6, size = 4};
lp = {name = 'Low-Power Chip', clockRate = 128e6, flash = 64e6, ram = 1e9, powerEfficiency = 1e11, size = 4};
carbon = {name = 'Carbon Chip', clockRate = 64e6, flash = 32e6, ram = 2e6, powerEfficiency = 2e10, size = 2, circ='carbon'};
}
E.chip.tiers.foreach('starlit_electronics:genChips', {}, function(id, t)
id = t.id or string.format('%s:chip_%s', minetest.get_current_modname(), id)
local circMat = t.circ or 'silicon';
starlit.item.chip.link(id, {
name = t.name;
clockRate = t.clockRate;
flash = t.flash;
ram = t.ram;
powerEfficiency = t.powerEfficiency; -- cycles per joule
................................................................................
pgm = {starlit.item.sw.db[pgm]}
end
sw = pgm
else
sw = {}
for i, e in ipairs(chips) do
if (not e:is_empty())
and minetest.get_item_group(e:get_name(), 'chip') ~= 0
then
for fl, inode in E.chip.files(e) do
if fl.kind == 'sw' then
local s = starlit.item.sw.db[fl.body.pgmId]
table.insert(sw, {
sw = s, chip = e, chipSlot = i;
file = fl, inode = inode;
|
|
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
...
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
...
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
...
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
...
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
...
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
...
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
|
return function(stack, ...)
local function fail()
error(string.format('object %q is not a %s', stack:get_name(), ty))
end
if not stack or stack:is_empty() then fail() end
if core.get_item_group(stack:get_name(), ty) == 0 then fail() end
return fn(stack,
stack:get_definition()._starlit[ty],
stack:get_meta(), ...)
end
end
................................................................................
totalPower = E.battery.charge;
initialPower = E.battery.capacity;
dischargeRate = E.battery.dischargeRate;
wasteHeat = function() return 0 end;
};
starlit.item.battery.foreach('starlit_electronics:battery-gen', {}, function(id, def)
core.register_tool(id, {
short_description = def.name;
groups = { battery = 1; dynamo = 1; electronic = 1; };
inventory_image = def.img or 'starlit-item-battery.png';
description = starlit.ui.tooltip {
title = def.name;
desc = def.desc;
color = lib.color(0,.2,1);
................................................................................
-----------
-- chips --
-----------
E.sw = {}
function E.sw.findSchematicFor(item)
local id = ItemStack(item):get_name()
local fm = core.registered_items[id]._starlit
if not (fm and fm.reverseEngineer) then return nil end
local id = fm.reverseEngineer.sw
return id, starlit.item.sw.db[id]
end
E.chip = { file = {} }
do local T,G = lib.marshal.t, lib.marshal.g
................................................................................
elseif file.kind == 'note' then
local sz = 0x10 + #file.body.author
for _, e in pairs(file.body.entries) do
sz = sz + #e.title + #e.body + 0x10 -- header overhead
end
return sz
elseif file.kind == 'research' then
local re = assert(core.registered_items[file.body.itemId]._starlit.reverseEngineer)
return starlit.item.sw.db[re.sw].size * file.body.progress
elseif file.kind == 'sw' then
return starlit.item.sw.db[file.body.pgmId].size
elseif file.kind == 'genome' then
return 0 -- TODO
end
end
................................................................................
end
function E.chip.update(chip)
chip:get_meta():set_string('description', E.chip.describe(chip))
end
starlit.item.chip.foreach('starlit_electronics:chip-gen', {}, function(id, def)
core.register_craftitem(id, {
short_description = def.name;
description = E.chip.describe(def, true);
inventory_image = def.img or 'starlit-item-chip.png';
groups = {chip = 1};
_starlit = {
fab = def.fab;
chip = def;
................................................................................
compute = {name = 'Compute Chip', clockRate = 4e9, flash = 24e6, ram = 64e9, powerEfficiency = 1e9, size = 4};
data = {name = 'Data Chip', clockRate = 128e3, flash = 2e12, ram = 32e3, powerEfficiency = 1e6, size = 4};
lp = {name = 'Low-Power Chip', clockRate = 128e6, flash = 64e6, ram = 1e9, powerEfficiency = 1e11, size = 4};
carbon = {name = 'Carbon Chip', clockRate = 64e6, flash = 32e6, ram = 2e6, powerEfficiency = 2e10, size = 2, circ='carbon'};
}
E.chip.tiers.foreach('starlit_electronics:genChips', {}, function(id, t)
id = t.id or string.format('%s:chip_%s', core.get_current_modname(), id)
local circMat = t.circ or 'silicon';
starlit.item.chip.link(id, {
name = t.name;
clockRate = t.clockRate;
flash = t.flash;
ram = t.ram;
powerEfficiency = t.powerEfficiency; -- cycles per joule
................................................................................
pgm = {starlit.item.sw.db[pgm]}
end
sw = pgm
else
sw = {}
for i, e in ipairs(chips) do
if (not e:is_empty())
and core.get_item_group(e:get_name(), 'chip') ~= 0
then
for fl, inode in E.chip.files(e) do
if fl.kind == 'sw' then
local s = starlit.item.sw.db[fl.body.pgmId]
table.insert(sw, {
sw = s, chip = e, chipSlot = i;
file = fl, inode = inode;
|